Câu hỏi Làm thế nào để tôi lập trình tắt một thể hiện của ExpressJS để thử nghiệm?


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 .listen(port) cuộc gọi - làm thế nào để tôi nhận được một máy chủ Express để STOP nghe, phát hành các cổng, và tắt máy sạch?

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à bối 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 bắt đầu 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, bất kỳ lời khuyên nào về cách làm điều 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.


76
2017-12-28 17:11


gốc




Các câu trả lời:


Mọi thứ đã thay đổi vì máy chủ tốc hành không còn được kế thừa từ máy chủ http của nút nữa. 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();
};

110
2018-06-07 16:50



Trong trường hợp của thử nghiệm Mocha, nơi bạn yêu cầu ('ứng dụng') tôi mở rộng vào đố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 (); - Jack Chi
khi kiểm tra máy chủ, hãy kiểm tra github.com/visionmedia/supertest nó sẽ cho phép bạn kiểm tra w / o tung ra máy chủ thực - Lukas


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 điện 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).

Liên kết:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (tương tự áp dụng cho)

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


12
2017-12-28 18:38



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
Cảm ơn Srijan, điều đó cũng giúp tôi - Adam Hopkinson
Đ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 nữa - Frank Schwieterman
Điều này là không hợp lệ kể từ khi thể hiện 3. - gprasant
Việc hiển thị một URL để đóng một máy chủ như thế này không phải là một ý kiến ​​hay về IMHO. - shime


Bạn có thể dễ dàng làm điều này bằng cách viết một kịch bản 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 nhìn vào Luồng công việc Git đơn giản của Jon Rohan cho một số thông tin chi tiết về điều này.


0
2017-12-28 17:28



Điều này sẽ làm việc, nhưng tôi muốn một 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 bạn 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
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ọ. - Josh Smith
Tôi không làm bất cứ điều gì đặc trưng cho 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
Bạn sẽ không đặt mã thử nghiệm của mình vào chính bash. Bạn chỉ cần khởi động máy chủ và chạy các thử nghiệm từ tập lệnh, giống như bạn sẽ tự làm trên dòng lệnh. Không có phép thuật đặc biệt thực sự ở đó. - Josh Smith