2011-12-28 30 views
71

Tôi đang cố gắng tìm ra cách tắt một thể hiện Express. Về cơ bản, tôi muốn nghịch đảo của cuộc gọi .listen(port) - làm cách nào để nhận máy chủ Express để STOP nghe, giải phóng cổng và tắt máy một cách rõ ràng?Làm thế nào để tôi lập trình tắt một thể hiện của ExpressJS để kiểm tra?

Tôi biết điều này có vẻ như nó có thể là một truy vấn lạ, vì vậy đây là ngữ cảnh; có thể có một cách khác để tiếp cận điều này và tôi đang nghĩ về nó một cách sai lầm. Tôi đang cố gắng thiết lập một khuôn khổ thử nghiệm cho ứng dụng socket.io/nodejs của tôi. Đó là một ứng dụng một trang, vì vậy trong các kịch bản thử nghiệm của tôi (tôi đang sử dụng Mocha, nhưng điều đó không thực sự quan trọng) Tôi muốn có thể khởi động máy chủ, chạy thử nghiệm với nó, và sau đó tắt máy chủ. Tôi có thể giải quyết vấn đề này bằng cách giả sử rằng máy chủ được bật trước khi thử nghiệm bắt đầu hoặc bằng một trong các thử nghiệm khởi động máy chủ và có mọi thử nghiệm tiếp theo giả định nó lên, nhưng điều đó thực sự lộn xộn. Tôi rất thích có mỗi tập tin thử nghiệm bắt đầu một thể hiện máy chủ với các thiết lập thích hợp và sau đó đóng trường hợp đó xuống khi các bài kiểm tra kết thúc. Điều đó có nghĩa là không có phụ thuộc kỳ lạ nào để chạy thử nghiệm và mọi thứ đều sạch sẽ. Nó cũng có nghĩa là tôi có thể thực hiện kiểm tra khởi động/tắt máy.

Vì vậy, mọi lời khuyên về cách thực hiện việc này? Tôi đã nghĩ về việc kích hoạt các ngoại lệ bằng tay để đưa nó xuống, nhưng điều đó có vẻ lộn xộn. Tôi đã đào tạo thông qua tài liệu Express và nguồn, nhưng dường như không thể tìm thấy bất kỳ phương pháp nào sẽ tắt máy chủ. Cũng có thể có một cái gì đó trong socket.io cho điều này, nhưng kể từ khi máy chủ socket chỉ được gắn vào máy chủ Express, tôi nghĩ điều này cần phải xảy ra ở lớp thể hiện.

Trả lời

100

Things have changed vì máy chủ nhanh không còn được thừa hưởng từ máy chủ nút http. May mắn thay, app.listen trả về cá thể máy chủ.

var server = app.listen(3000); 

// listen for an event 
var handler = function() { 
    server.close(); 
}; 
+13

Trong trường hợp kiểm tra Mocha, nơi bạn yêu cầu ('ứng dụng') tôi mở rộng lên đối tượng ứng dụng: app.server = app.listen (3000); vì vậy sau này tôi có thể nói: var app = require ('./ app'); app.server.close(); –

+1

khi kiểm tra máy chủ, hãy kiểm tra https://github.com/visionmedia/supertest nó sẽ cho phép bạn kiểm tra việc khởi chạy máy chủ thực –

0

Bạn có thể dễ dàng thực hiện việc này bằng cách viết tập lệnh bash để khởi động máy chủ, chạy thử nghiệm và dừng máy chủ. Điều này có lợi thế là cho phép bạn đặt bí danh cho tập lệnh đó để chạy tất cả các bài kiểm tra của bạn một cách nhanh chóng và dễ dàng.

Tôi sử dụng các tập lệnh như vậy cho toàn bộ quá trình triển khai liên tục của mình. Bạn nên xem Jon Rohan's Dead Simple Git Workflow để biết một số thông tin chi tiết về điều này.

+2

Điều này sẽ hiệu quả, nhưng tôi muốn có giải pháp bash-miễn phí nếu có thể. Có lẽ đó là một sở thích ngu ngốc, nhưng tôi muốn bắt đầu/dừng máy chủ từ ngữ cảnh thử nghiệm vì nó giúp dễ dàng hơn trong việc viết các bài kiểm tra máy chủ-cấu hình cụ thể + các bài kiểm tra khởi động/tắt máy. Thêm vào đó, nó không giới thiệu sự gián đoạn của việc phải chạy các bài kiểm tra liên quan đến máy chủ thông qua một kịch bản riêng biệt. – drewww

+0

Tại sao bạn viết các bài kiểm tra môi trường cụ thể? Có lẽ tôi sai, nhưng điều này khiến tôi trở nên tệ hại. Tôi sẽ cố gắng duy trì môi trường bất khả tri với thử nghiệm của bạn, vì bạn muốn các bài kiểm tra của mình hoạt động trong nhóm của bạn bất kể môi trường phát triển của họ. –

+0

Tôi không làm bất cứ điều gì cụ thể về môi trường ở đây, tôi không nghĩ. Sẽ có một số tùy chọn khởi động khác nhau cho máy chủ (như đọc các tùy chọn cấu hình từ một tệp, tải trạng thái từ kho dữ liệu, v.v.) sẽ tốt hơn nếu thử nghiệm trong cùng một khung công tác mà tôi thử nghiệm mọi thứ khác. Tôi cũng muốn có các thử nghiệm, ví dụ, tắt máy chủ, đưa nó trở lại, và chắc chắn rằng nó không bị mất trạng thái trong tiến trình. Đó là dễ dàng hơn nếu tôi có thể làm điều đó lập trình từ nút hơn là có mã thử nghiệm trong bash, quá. – drewww

12

Sử dụng app.close(). Ví dụ đầy đủ:

var app = require('express').createServer(); 
app.get('/', function(req, res){ 
    res.send('hello world'); 
}); 
app.get('/quit', function(req,res) { 
    res.send('closing..'); 
    app.close(); 
}); 
app.listen(3000); 

Gọi app.close() bên trong cuộc gọi lại khi kiểm tra kết thúc. Nhưng hãy nhớ rằng quá trình vẫn đang chạy (mặc dù nó không phải là nghe nữa).

Nếu sau này, bạn cần phải kết thúc quá trình, sau đó gọi process.exit(0).

Links:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (cũng áp dụng cho)

process.exit: http://nodejs.org/docs/latest/api/process.html#process.exit

+1

Hoàn hảo, chính xác những gì tôi đang tìm kiếm. Tôi đoán tôi đã không tìm thấy nó trong Express bởi vì họ đã mở rộng máy chủ http nút lõi, mà tôi đã không hoàn toàn hiểu được. Cảm ơn! – drewww

+0

Cảm ơn Srijan, điều đó đã giúp tôi quá –

+0

Điều này vẫn đúng? express.createServer là dấu hiệu bị phản đối và cho biết lỗi nói rằng ứng dụng không còn được kế thừa từ máy chủ của http.js –

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