2011-12-02 10 views
34

¿Puedo crear un servidor Express que escuche tanto HTTP como HTTPS, con las mismas rutas y los mismos middlewares?Escuchar HTTP y HTTPS para una sola aplicación express

Actualmente hago esto con Express on HTTP, con stunnel tunelizando HTTPS a Express, pero prefiero una solución de Nodo puro.

lo puedo hacer con este código, pero utilizando el método handle que está marcado como privado:

var express = require('express') 
    , https = require("https") 
    , fs = require('fs'); 

var app = express.createServer(); 
// init routes and middlewares 
app.listen(80); 

var privateKey = fs.readFileSync('privatekey.pem').toString(); 
var certificate = fs.readFileSync('certificate.pem').toString(); 
var options = {key: privateKey, cert: certificate}; 
https.createServer(options, function(req,res) 
{ 
    app.handle(req, res); 
}).listen(443); 
+0

Respondido sucintamente aquí: http://stackoverflow.com/a/23894573/1882064 – arcseldon

Respuesta

17

Puede compartir la puesta en práctica a través de algo como:

var register = function (app) { 
    // config middleware 
    app.configure({ 

    }); 

    // config routes 
    app.get(...); 
}; 

var http = express.createServer(); 
register(http); 
http.listen(80); 

var https = express.createServer({ key: /* https properties */ }); 
register(https); 
https.listen(443); 
+0

¡Una buena manera de hacer esto! – Jazz

+10

Esta solución ahora está en desuso. ¿Hay una solución más nueva? –

+0

@CMN - Vea la solución de cmd a continuación. Funciona con las versiones actuales de Node (v4.4.2) y Express (4.13.4) – paulsm4

0

puesto similar

Can I configure expressjs to serve some pages over http and others over https?

Tenga en cuenta que expresan ahora admite la creación de HTTPS con:

var app = require('express').createServer({ key: ... }); 
+0

que sabe cómo crear un servidor HTTPS, pero no un servidor que responda tanto en HTTP como en HTTPS. – Jazz

+0

¿Has leído la otra publicación? Hay un ejemplo en la publicación. Crea 2 instancias de servidor y hace que una escuche en el puerto 80 y una en 443, Http y Https. –

+1

Sí, leí la otra publicación: hay 2 instancias de servidor con diferentes rutas.Quiero las mismas rutas para ambos (o solo una instancia para escuchar en HTTP y HTTPS). – Jazz

30

Como una posible actualización a esta pregunta, es posible que desee echa un vistazo a los cambios here para expreso 3. El documento de cambio dice:

El el valor de retorno de express() es una función de JavaScript, que encapsula todo lo que hace que una aplicación Express funcione. Esto significa puede fácilmente HTTP configuración y HTTPS versiones de su aplicación por pasándolo al nodo de http.createServer() y https.createServer():

En Express 3, express.createServer() es ahora express()

Aquí es un ejemplo completo de expreso 3 :

var fs = require('fs') 
    , https = require('https') 
    , http = require('http') 
    , express = require('express') 
    , keys_dir = 'keys/' 
    , server_options = { 
     key : fs.readFileSync(keys_dir + 'privatekey.pem'), 
     ca : fs.readFileSync(keys_dir + 'certauthority.pem'), 
     cert : fs.readFileSync(keys_dir + 'certificate.pem') 
     } 
    , app = express(); 
app.configure(function(){ 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.session({ secret: '' })); 
    app.use(app.router); 
}); 
app.configure('development',function(){ 
    app.use(express.static(__dirname + '/public')); 
    app.use(express.errorHandler({dumpExceptions: true, showStack:true})); 
    app.set('view options', { pretty: true }); 
}); 
app.get('/', function(req, res){ 
    res.send('Hello World!'); 
}); 
https.createServer(server_options,app).listen(7000); 
http.createServer(app).listen(8000); 
+15

Es preferible responder una pregunta utilizando el mismo lenguaje que utilizó el asker. Me he tomado la libertad de traducir el coffeescript a vanilla JS. – gcochard

+0

Respondido sucintamente aquí: http://stackoverflow.com/a/23894573/1882064 – arcseldon

17

para habilitar su aplicación para escuchar tanto para http y https en los puertos 80 y 443 respectivamente, haga lo siguiente

crear una aplicación expresa:

var express = require('express'); 
var app = express(); 

La aplicación devuelto por express() es una función de JavaScript. Se puede pasar a los servidores HTTP de Node como una devolución de llamada para manejar las solicitudes. Esto facilita el suministro de versiones HTTP y HTTPS de su aplicación utilizando la misma base de código.

Puede hacerlo de la siguiente manera:

var express = require('express'); 
var https = require('https'); 
var http = require('http'); 
var fs = require('fs'); 
var app = express(); 

var options = { 
    key: fs.readFileSync('/path/to/key.pem'), 
    cert: fs.readFileSync('/path/to/cert.pem') 
}; 

http.createServer(app).listen(80); 
https.createServer(options, app).listen(443); 

Para ver el detalle completo del doc