2011-12-02 14 views
34

Posso creare un server Express in ascolto sia su HTTP che su HTTPS, con le stesse route e gli stessi middleware?Ascolta su HTTP e HTTPS per una singola app express

Attualmente lo faccio con Express su HTTP, con stunnel tunneling HTTPS per Express, ma preferisco una soluzione di nodo puro.

posso farlo con questo codice, ma con il metodo handle che è contrassegnato come privato:

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

Risposto succintamente qui: http://stackoverflow.com/a/23894573/1882064 – arcseldon

risposta

17

È possibile condividere l'applicazione via qualcosa come:

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

Bel modo per farlo! – Jazz

+10

Questa soluzione è ora obsoleta. C'è una nuova soluzione? –

+0

@ CMN - Vedere la soluzione di cmd di seguito. Funziona con le versioni correnti di Node (v4.4.2) ed Express (4.13.4) – paulsm4

0

post simile

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

essere consapevoli del fatto che esprimono ora supporta la creazione di HTTPS con:

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

so come creare un server HTTPS, ma non un server che risponde sia su HTTP che su HTTPS. – Jazz

+0

Hai letto l'altro post? C'è un esempio nel post. Crei 2 istanze del server e fai un ascolto sulla porta 80 e una su 443, Http e Https. –

+1

Sì, ho letto l'altro post: ci sono 2 istanze del server con percorsi diversi.Voglio gli stessi percorsi per entrambi (o solo un'istanza che ascolta su HTTP e HTTPS). – Jazz

30

Come un eventuale aggiornamento a questa domanda, si potrebbe voler controllare i cambiamenti here per Express 3. Il documento di cambiamento dice:

Il il valore di ritorno di express() è una funzione JavaScript, che incapsula tutto ciò che fa spuntare un'app Express. Questo significa puoi versioni facilmente configurare HTTP e HTTPS della vostra applicazione di passarlo al nodo di http.createServer() e https.createServer():

In Espresso 3, express.createServer() è ora express()

Ecco un esempio completo per espresso 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

È preferibile rispondere a una domanda utilizzando la stessa lingua utilizzata dal richiedente. Mi sono permesso di tradurre il coffeescript in vanilla JS. – gcochard

+0

Risposta concisa qui: http://stackoverflow.com/a/23894573/1882064 – arcseldon

17

per consentire la vostra applicazione per ascoltare sia per http e https sulle porte 80 e 443, rispettivamente, effettuare le seguenti operazioni

Creare un app espresso:

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

L'applicazione restituito da express() è una funzione JavaScript. Può essere passato ai server HTTP del nodo come richiamo per gestire le richieste. Ciò semplifica la fornitura delle versioni HTTP e HTTPS della tua app utilizzando la stessa base di codice.

È possibile farlo nel modo seguente:

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); 

Per dettagli completi vedere il doc

Problemi correlati