web-dev-qa-db-ja.com

単一のエクスプレスアプリのHTTPおよびHTTPSでリッスンする

同じルートと同じミドルウェアを使用して、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 );
50
Jazz

次のような方法で実装を共有できます。

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);
25
Jan Jongboom

この質問の可能な更新として、エクスプレス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);
36
SnapShot

アプリがポート_80_および_443_でそれぞれhttphttpsの両方をリッスンできるようにするには、次の手順を実行します。

エクスプレスアプリを作成します。

_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 を参照してください

31
cmd

同じポートで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');
});
1

同様の投稿

httpを介して一部のページを提供し、httpsを介して他のページを提供するようにexpressjsを構成できますか?

Expressは、次のHttpsサーバーの作成をサポートするようになりました。

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

従来の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();
});

これはカスタムポートで設定できます

0
Peter Weeks