2017-04-20 117 views
5

我嘗試將我的服務器更改爲HTTPS,但無法正常工作。 我的頁面顯示就像我用任何東西創建一個新的服務器。 在這種情況下,我有2個文件,app.js與express需要和路線,我server.js執行服務器要求./appNodejs將服務器HTTP更改爲HTTPS

我app.js(服務器端):

var express = require('express'); // app server 
var bodyParser = require('body-parser'); // parser for post requests 
var http = require('http'); 
var https = require('https'); 
//all endpoints is inside my app.js 
var app = express(); 

// endpoints here 
//code .. code with routes, code... 

module.exports = app; 

我server.js(服務器端):

var fs = require('fs') 
    var server = require('./app'); 
    var port = process.env.PORT || process.env.VCAP_APP_PORT || 3000; 


    var options = { 
     key: fs.readFileSync('certificates/xxx.key'), 
     cert: fs.readFileSync('certificates/xxx.cer') 
    }; 

    server.listen(port, options, function() { 
     console.log('Server execute here %d', port); 
    }); 

也許是一個新手的問​​題,我可以創造一個服務器只有一個文件,但我不知道如何與這種情況下創建...

有人可以幫助我,並解釋我做錯了這種情況下使用?

回答

3

在你的情況下,你從app.js導出的是一個快速app對象。這不是創建https服務器的正確對象。相反,您需要手動創建https服務器,然後將您的快速應用與該服務器相關聯。您可以在這裏看到Express文檔:https://expressjs.com/en/api.html#app.listen

如果您在Express repository on Github看代碼爲app.listen(),你會看到,它所做的是這樣的:

app.listen = function listen() { 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
}; 

因此,它是硬連線創建http服務器,也沒有辦法創建一個https服務器。

要創建https服務器,您必須自己創建服務器,並指定app對象作爲它的請求處理程序。

對於一般的方案是這樣的:

var express = require('express'); 
var https = require('https'); 
var app = express(); 
var options = {...}; // read certificates in here 

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

請注意,您手動使用https模塊來創建HTTPS服務器對象,然後將你的快遞物件與作爲請求處理程序相關聯。 Express中的app.listen()接口不提供https服務器創建,因此您必須自行完成。


如果你真的想用你的兩個文件,那麼你可以這樣做:

app.js

var express = require('express'); // app server 
var bodyParser = require('body-parser'); // parser for post requests 
//all endpoints is inside my app.js 
var app = express(); 

// endpoints here 
//code .. code with routes, code... 

module.exports = app; 

server.js

var fs = require('fs') 
var app = require('./app'); 
var port = process.env.PORT || process.env.VCAP_APP_PORT || 443; 
var https = require('https'); 


var options = { 
    key: fs.readFileSync('certificates/xxx.key'), 
    cert: fs.readFileSync('certificates/xxx.cer') 
}; 

https.createServer(options, app).listen(port); 
+0

嗨@ jfriend00,感謝您的幫助提前。我做了你的例子,我得到這個錯誤:ERR_EMPTY_RESPONSE頁面本地主機不工作,沒有數據已發送到本地主機。你知道這個問題怎麼樣? –

+1

@SayuriMizuguchi - 您的代碼不會顯示任何Express路由處理程序,例如'app.get('/',function(req,res){code here})'實際處理特定請求併發送響應。 – jfriend00

+1

@SayuriMizuguchi - 現在你的原始問題現在已經回答了,因爲你的http服務器已經啓動並正在運行。你現在有另一個問題,可能與'res.render()'和你的模板有關,這應該是一個新問題。也許你需要[註冊適當的視圖引擎](https://expressjs.com/en/guide/using-template-engines.html),但我們不應該在這裏討論這個問題。如果您需要進一步的幫助,請發佈一個新問題。你可以通過使用'res.send(「hello」)來驗證你的https服務器正在工作。 – jfriend00