làm thế nào để đóng máy chủ node-express đúng cách?


84

Tôi cần đóng máy chủ sau khi nhận được cuộc gọi lại từ /auth/github/callback url. Với máy chủ đóng API HTTP thông thường hiện đang hỗ trợ server.close([callback]) chức năng API, nhưng với máy chủ node-express, tôi đang gặp TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' lỗi. Và tôi không biết tìm kiếm thông tin như thế nào để giải quyết vấn đề này.
Tôi nên đóng máy chủ express như thế nào?

Ghi chú cấu hình NodeJS:

$ node --version
v0.8.17
$ npm --version
1.2.0
$ npm view express version
3.0.6

Mã ứng dụng thực tế:

var app = express();

// configure Express
app.configure(function() {
    // … configuration
});

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            app.close();
            // TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close'
        }, 3000)
    }
);

app.listen('http://localhost:5000/');

Ngoài ra, tôi đã tìm thấy 'nodejs hiện gần ...' nhưng tôi không chắc chắn nếu tôi có thể sử dụng nó với mã tôi có: var app = express();.

Câu trả lời:


114

app.listen()lợi nhuận http.Server. Bạn nên gọi close()trên trường hợp đó chứ không phải trên apptrường hợp.

Ví dụ.

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            server.close();
            // ^^^^^^^^^^^
        }, 3000)
    }
);

var server = app.listen('http://localhost:5000/');

Bạn có thể kiểm tra các nguồn: /node_modules/express/lib/application.js


4
Kỳ lạ, nó không đóng cửa nếu tôi truy cập vào một số tuyến đường.
Uday Hiwarale,

1
@Uday, tôi cũng trải qua điều này. Tôi phát hiện ra rằng trình duyệt của mình có kết nối liên tục HTTP1.1 đang mở, vì vậy khi tôi nhấn F5, nó xuất hiện như thể máy chủ chưa đóng. Nếu bạn thử một trình duyệt khác, bạn sẽ thấy ổ cắm máy chủ không chạy.
Rick Velde

Đó là sai lầm của tôi, tôi đã gọi gần appthay vì server. Đã lưu ngày của tôi. Cảm ơn nhiều 👍
Edison Spencer

48

Trong express v3 họ đã loại bỏ chức năng này.

Bạn vẫn có thể đạt được điều tương tự bằng cách gán kết quả của app.listen()hàm và áp dụng đóng trên nó:

var server = app.listen(3000);
server.close()

https://github.com/visionmedia/express/issues/1366


Sử dụng một cái gì đó như github.com/gajus/http-terminator để đảm bảo chấm dứt máy chủ trong trường hợp có các kết nối liên tục hoặc yêu cầu không tạo ra phản hồi.
Gajus

ngắn và đơn giản
krupesh Anadkat

4

Nếu bất kỳ lỗi nào xảy ra trong ứng dụng express của bạn thì bạn phải đóng máy chủ và bạn có thể thực hiện như bên dưới-

var app = express();
var server = app.listen(process.env.PORT || 5000)

Nếu có bất kỳ lỗi nào xảy ra thì ứng dụng của chúng tôi sẽ nhận được một tín hiệu có tên SIGTERM

Bạn có thể đọc thêm về tín hiệu nút tại đây-

https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  console.log('Closing http server.');
  server.close(() => {
    console.log('Http server closed.');
  });
});

xin lỗi, nó không liên quan. Câu hỏi là về việc cài đặt máy chủ tắt máy và không phải là về xử lý lỗi
Vladimir Starkov

1

Tôi đã trả lời một biến thể của "cách chấm dứt máy chủ HTTP" nhiều lần trên các các kênh hỗ trợ. Rất tiếc, tôi không thể giới thiệu bất kỳ thư viện hiện có nào vì chúng đang thiếu theo cách này hay cách khác. Kể từ đó, tôi đã tập hợp một gói mà (tôi tin rằng) đang xử lý tất cả các trường hợp dự kiến ​​về việc chấm dứt máy chủ HTTP (S) express.js duyên dáng.

https://github.com/gajus/http-terminator

Lợi ích chính của http-terminator là:

  • nó không phải là API Node.js Monkey-patch
  • nó ngay lập tức phá hủy tất cả các ổ cắm mà không có yêu cầu HTTP đính kèm
  • nó cho phép hết thời gian chờ đến các ổ cắm với các yêu cầu HTTP đang diễn ra
  • nó xử lý đúng các kết nối HTTPS
  • nó thông báo cho các kết nối bằng cách sử dụng chức năng giữ mạng rằng máy chủ đang tắt bằng cách thiết lập kết nối: đóng tiêu đề
  • nó không chấm dứt quá trình Node.js

cảm ơn bạn đã trả lời, nhưng câu hỏi này là 7 tuổi
Vladimir Starkov

5
Nó vẫn là một câu hỏi hợp lệ.
Gajus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.