2011-12-02 28 views
34

Tôi có thể tạo máy chủ Express nghe trên cả HTTP và HTTPS, với cùng tuyến đường và cùng phần mềm trung gian không?Nghe trên HTTP và HTTPS cho một ứng dụng express đơn

Hiện tại tôi làm điều này với Express trên HTTP, với đường dẫn HTTPS là Express, nhưng tôi thích giải pháp Node thuần túy hơn.

tôi có thể làm điều đó với mã này, nhưng sử dụng handle phương pháp được đánh dấu là tin:

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

trả lời ngắn gọn ở đây: http://stackoverflow.com/a/23894573/1882064 – arcseldon

Trả lời

17

Bạn có thể chia sẻ việc thực hiện thông qua một cái gì đó như:

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

Cách tốt nhất để làm điều này! – Jazz

+10

Giải pháp này hiện không được chấp nhận. Có giải pháp mới hơn không? –

+0

@CMN - Xem giải pháp của cmd dưới đây. Nó hoạt động với các phiên bản hiện tại của Node (v4.4.2) và Express (4.13.4) – paulsm4

0

bài tương tự

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

Hãy nhận biết rằng bây giờ thể hiện hỗ trợ tạo Https máy chủ với:

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

tôi biết làm thế nào để tạo ra máy chủ HTTPS chứ không phải máy chủ phản hồi cả trên HTTP và HTTPS. – Jazz

+0

Bạn đã đọc bài đăng khác chưa? Có một ví dụ trong bài viết. Bạn tạo ra 2 trường hợp máy chủ và thực hiện một lắng nghe trên cổng 80 và một trên 443, Http và Https. –

+1

Có, tôi đã đọc bài đăng khác: có 2 phiên bản máy chủ với các tuyến khác nhau.Tôi muốn các tuyến đường giống nhau cho cả hai (hoặc chỉ một cá thể nghe trên HTTP và HTTPS). – Jazz

30

Là một bản cập nhật có thể cho câu hỏi này, bạn có thể muốn kiểm tra những thay đổi here cho nhanh 3. Văn bản thay đổi nói:

Các giá trị trả về của express() là một hàm JavaScript, đóng gói mọi thứ tạo nên dấu tick ứng dụng Express. Điều này có nghĩa bạn có thể dễ dàng thiết lập HTTP và HTTPS phiên bản của ứng dụng của bạn bằng cách đi qua nó để nút của http.createServer()https.createServer():

Trong Express 3, express.createServer() tại là express()

Dưới đây là một ví dụ hoàn chỉnh cho nhanh 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

Nó thích hợp hơn để trả lời một câu hỏi bằng cùng một ngôn ngữ mà người hỏi đã sử dụng. Tôi đã tự do dịch bản dịch sang vani JS. – gcochard

+0

Được trả lời gọn gàng ở đây: http://stackoverflow.com/a/23894573/1882064 – arcseldon

17

để kích hoạt ứng dụng của bạn để lắng nghe cho cả httphttps trên các cổng 80443 tương ứng, thực hiện như sau

Tạo một ứng dụng nhanh:

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

Ứng dụng trả về bởi express() là một hàm JavaScript. Nó có thể được chuyển đến các máy chủ HTTP của Node dưới dạng gọi lại để xử lý các yêu cầu. Điều này giúp bạn dễ dàng cung cấp cả phiên bản HTTP và HTTPS của ứng dụng bằng cách sử dụng cùng một cơ sở mã.

Bạn có thể làm như vậy như sau:

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

Đối với chi tiết hoàn chỉnh thấy doc

Các vấn đề liên quan