同じルートと同じミドルウェアを使用して、HTTPとHTTPSの両方でリッスンするExpressサーバーを作成できますか?
現在、HTTPのExpressで 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 );
次のような方法で実装を共有できます。
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);
この質問の可能な更新として、エクスプレス3の変更 here をチェックアウトすることをお勧めします。
express()
の戻り値はJavaScript関数であり、Expressアプリを動かすすべてをカプセル化します。これは、ノードのhttp.createServer()
およびhttps.createServer()
に渡すことで、アプリケーションのHTTPおよびHTTPSバージョンを簡単にセットアップできることを意味します。
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);
アプリがポート_80
_および_443
_でそれぞれhttp
とhttps
の両方をリッスンできるようにするには、次の手順を実行します。
エクスプレスアプリを作成します。
_var express = require('express');
var app = express();
_
express()
によって返されるアプリはJavaScript関数です。リクエストを処理するためのコールバックとしてNodeのHTTPサーバーに渡すことができます。これにより、同じコードベースを使用して、アプリの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 を参照してください
同じポートでexpressと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');
});
同様の投稿
httpを介して一部のページを提供し、httpsを介して他のページを提供するようにexpressjsを構成できますか?
Expressは、次のHttpsサーバーの作成をサポートするようになりました。
var app = require('express').createServer({ key: ... });
従来の2つのポートを使用する場合、上記のソリューションの1つはおそらく機能しますが、httpolyglotを使用すると、同じミドルウェアを使用して同じポートにhttpとhttpsを簡単に配置できます。
https://github.com/mscdex/httpolyglot
私のために働いたいくつかのスケルトンコードは次のとおりです。
var express = require('express');
var fs = require('fs');
var httpolyglot = require('httpolyglot');
var app = express();
const options = {
key: fs.readFileSync("/etc/ssl/certs/key"),
cert: fs.readFileSync("/etc/ssl/certs/cer.cer")
};
httpolyglot.createServer(options, app).listen(port);
http-> https転送が必要な場合は、createServer()呼び出しの前にこのミドルウェア関数を追加するだけです。
app.use(function(req, res, next) {
if (!req.secure ) {
res.redirect (301, 'https://' + req.hostname + ':port' + req.originalUrl);
}
next();
});
これはカスタムポートで設定できます