Слушайте HTTP и HTTPS для одного экспресс-приложения
Можно ли создать сервер Express, прослушивающий как HTTP, так и HTTPS, с теми же маршрутами и теми же средними?
В настоящее время я делаю это с помощью Express по HTTP, stunnel туннелирует HTTPS для Express, но я предпочитаю чистое решение Node.
Я могу сделать это с помощью этого кода, но используя метод handle
, который помечен как закрытый:
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 );
Ответы
Ответ 1
Вы можете поделиться реализацией через что-то вроде:
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);
Ответ 2
В качестве возможного обновления для этого вопроса вы можете проверить изменения здесь для выражения 3. В документе изменений говорится:
Возвращаемое значение express()
- это функция JavaScript, инкапсулируя все, что делает ярлык приложения Express. Это означает вы можете легко настроить версии HTTP и HTTPS вашего приложения на передав его node http.createServer()
и https.createServer()
:
В Express 3, express.createServer()
теперь express()
Вот полный пример для выражения 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);
Ответ 3
Чтобы ваше приложение могло прослушивать как http
, так и https
на портах 80
и 443
соответственно, выполните следующие
Создайте экспресс-приложение:
var express = require('express');
var app = express();
Приложение, возвращаемое express()
, является функцией JavaScript. Его можно передать HTTP-серверам Node s в качестве обратного вызова для обработки запросов. Это упрощает предоставление как HTTP, так и HTTPS-версий вашего приложения с использованием той же базы кода.
Вы можете сделать это следующим образом:
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);
Подробнее см. doc
Ответ 4
Вы можете использовать экспресс и https в одном и том же порту.
это работает для меня.
const express=require('express');
const app=express();
const cors=require('cors');
const path=require("path");
const routes=require('./routes/api');
const routerComplain=require('./routes/api');
const routerstores=require('./routes/api');
const routerstock=require('./routes/api');
const routerreport=require('./routes/api');
const routeritem=require('./routes/api');
const bodyParser=require('body-parser');
const routerRegister=require('./routes/api');
const mongoose=require('mongoose');
var server = require('http').Server(app);
var io = require('socket.io')(server);
require("dotenv").config();
mongoose.connect('mongodb://@@@@@@@@@@@@@@@@@',{ useNewUrlParser: true },(err)=>{
if(!err){
console.log('db connected')
}else{
console.log('error in db')
}
});
mongoose.Promise = global.Promise;
app.use(express.static('public'));
app.use(bodyParser.json());
app.use(cors({credentials: true, origin:'http://localhost:3000'}));
app.use(express.static(path.join(__dirname, "client", "build")))
app.use('/reg',routes);
app.use('/complain',routerComplain);
app.use('/register',routerRegister);
app.use('/stores',routerstores);
app.use('/reports',routerreport);
app.use('/stock',routerstock);
app.use('/items',routeritem);
app.get("*", (req, res) => {
res.sendFile(path.join(__dirname, "client", "build", "index.html"));
});
io.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
})
const port = process.env.port||4000;
server.listen(port,function(){
console.log('now listening for request');
});
Ответ 5
Похожие сообщения
Могу ли я настроить expressjs для обслуживания некоторых страниц через http и других пользователей по https?
Имейте в виду, что express теперь поддерживает создание серверов Https с помощью:
var app = require('express').createServer({ key: ... });