a

Câu hỏi Cách thoát trong Node.js


Lệnh được sử dụng để thoát là gì? (tức là quá trình node.js chấm dứt)


1367
2018-03-10 21:30


gốc




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


Gọi cho toàn cầu process các đối tượng exit phương pháp:

process.exit()

Từ tài liệu:

process.exit ([code])

Kết thúc quá trình với quy định code. Nếu bỏ qua, thoát sẽ sử dụng mã 'thành công' 0.

Để thoát bằng mã 'lỗi':

process.exit(1);

Hệ vỏ thực hiện nút sẽ thấy mã thoát là 1.


1701
2018-03-10 21:36



Chỉ muốn thêm một cái gì đó. Nếu bạn đang xử lý yêu cầu, bạn cũng nên end() yêu cầu là tốt. Nếu không, nó sẽ chỉ treo. - pixelfreak
@pixelfreak, exit không gây hiểu lầm chút nào. Bạn đang bối rối về cách Node hoạt động. Hãy nghĩ về Node là chính máy chủ. Nó không chỉ bắn lên khi cần thiết, như PHP nằm trong một máy chủ web như Apache. Node thậm chí không có bất cứ điều gì để làm với các máy chủ web ở tất cả! Nó chỉ là một máy chủ cho một số JavaScript, với một số thư viện tích hợp tiện lợi để làm những việc hữu ích. - Brad
@ Brad và PHP là một ngôn ngữ mục đích chung. Không cần phải chạy nó với mod_php hoặc sử dụng Apache. Bạn có thể reimplement một httpd trong PHP như nút nào nếu bạn thực sự muốn hoặc sử dụng một cách tiếp cận sane / chuẩn hóa hơn như FastCGI giống như bạn có thể trong nút. - binki
Xin lưu ý rằng process.exit() Là không được khuyến khích, như được mô tả trong câu trả lời dưới đây. - AndreasPizsa


Từ chính thức nodejs.org tài liệu:

process.exit(code)

Kết thúc quá trình với mã được chỉ định. Nếu bỏ qua, thoát sẽ sử dụng mã 'thành công' 0.

Để thoát bằng mã 'lỗi':

process.exit(1);

320
2018-03-22 18:48



@Alison có, hoặc chính xác hơn code = 0; process.exit(code); - wprl
Có đúng là nếu bạn đang thoát, bạn có thể không quan tâm đến giá trị của code? - Armand
@ Alison Một ý tưởng tốt hơn chỉ là process.exit() không có tham số là mã mặc định là 0 - Jeremy - DeerAngel-org
@Armand Bạn đúng - Mã chỉ là một biến, và trong trường hợp này được sử dụng để chỉ ra tham số là gì. Vì vậy, .exit (0) làm tất cả mọi thứ ví dụ nào. - Gerard ONeill
@Armand mã không dành cho bạn, nó cho bất cứ điều gì chạy mã của bạn. Ví dụ: nếu bạn tạo exit_0.js bằng process.exit(0); và chạy nó với node exit_0.js && echo 'success' nó sẽ nói "thành công". Nếu bạn tạo exit_1.js bằng process.exit(1); và chạy node exit_1.js && echo 'success' nó sẽ không nói "thành công" vì quá trình của bạn đã thoát với một số không khác (cho biết "lỗi" hoặc "thoát bất thường" đối với trình bao). Ngoài ra, bạn sẽ thấy các giá trị khác nhau trong $? Nếu bạn chạy node exit_1.js so với node exit_0.js (bạn có thể kiểm tra bằng cách làm node exit_1.js và sau đó làm echo $?). - msouth


Nếu bạn đang ở trong một thiết bị đầu cuối Unix hoặc dòng lệnh Windows và muốn thoát khỏi Node REPL, hoặc là ...

  • nhấn Ctrl + C hai lần, hoặc
  • kiểu .exit và nhấn Enter hoặc
  • nhấn Ctrl + D ở đầu dòng (chỉ Unix)

237
2018-06-02 13:02



Lưu ý rằng, ngoài Node, phím tắt Ctrl + D trên Mac hoặc Linux hoạt động trên hầu hết các shell và REPL mà bạn từng gặp, bao gồm các shell Unix như Bash, các shell cho các cơ sở dữ liệu như MySQL và PostgreSQL, và REPL cho các ngôn ngữ lập trình như Python, PHP và Ruby. Đó là phương pháp duy nhất để thoát khỏi shell mà tôi từng sử dụng. - Mark Amery
Cho node REPL, Ctrl + D để thoát là một hành vi tiêu chuẩn, vì vậy nó cũng hoạt động trên Windows. - Alan


Chỉ cần lưu ý rằng việc sử dụng process.exit([number]) Là không được khuyến khích thực hành.

Lý do là vấn đề là vì ghi vào process.stdout trong   Node.js không bị chặn và có thể xảy ra trong nhiều lần đánh dấu của   Vòng lặp sự kiện Node.js. Gọi process.exit (), tuy nhiên, buộc   quá trình để thoát ra trước khi những bổ sung viết để stdout có thể được   được thực hiện.

Thay vì gọi process.exit () trực tiếp, mã nên đặt   process.exitCode và cho phép quá trình thoát tự nhiên bằng cách tránh   lên lịch bất kỳ công việc bổ sung nào cho vòng lặp sự kiện:

Nếu bạn có thể nên đặt mã thoát và cho phép Node thoát ra một cách duyên dáng:

process.exitCode = 1;

179
2017-07-06 05:52



Đây là câu trả lời tốt nhất, cho đến nay. Các câu trả lời khác có thể không cho phép nút xử lý đúng các sự kiện đang chờ xử lý trước khi thoát, rất buồn :( - djabraham
Đồng ý, điều này sẽ có nhiều upvotes hơn! Tôi đã có một kịch bản nút đã được khởi động nhiều quá trình con thông qua shelljs.exec và tôi muốn kịch bản tổng thể của tôi để trở về với một mã thoát lỗi nếu bất kỳ các quá trình con không thành công. process.exitCode = 1 làm việc tốt trong callbacks exec (trong khi đơn giản gọi process.exit (1) trong đó sẽ thoát khỏi kịch bản chính trước khi tất cả các tiến trình con hoàn tất!) - Nick
Tôi đã sử dụng câu trả lời này và thấy rằng quá trình của tôi chưa bao giờ thực sự thoát. Đã phải ctrl-C nó. - jcollum
Sau đó, tôi muốn tưởng tượng một cái gì đó là giữ nó mở - nếu bạn làm echo "console.log('hello')" >> ./test.js && node test.js bạn sẽ thấy nó in hello và sau đó thoát - Dominic Tobias
Có nhiều trường hợp sử dụng cho quá trình ngay lập tức và chấm dứt sự kiện đang chờ xử lý. Đó là chính xác những gì process.exit() dành cho. - Dominic Cerisano


Từ dòng lệnh, .exit là những gì bạn muốn:

$ node
> .exit
$

Nó được ghi lại trong Tài liệu REPL. REPL (Read-Eval-Print-Loop) là dòng lệnh Node được gọi.

Từ một chương trình bình thường, sử dụng process.exit([code]).


109
2017-10-29 16:51





Nó phụ thuộc vào lý do tại sao bạn sẵn sàng thoát khỏi quá trình node.js, nhưng trong mọi trường hợp process.exit() là tùy chọn cuối cùng để xem xét. Trích dẫn từ tài liệu:

Điều quan trọng cần lưu ý là gọi điện process.exit() sẽ buộc   quá trình thoát càng nhanh càng tốt ngay cả khi vẫn còn   các hoạt động không đồng bộ đang chờ xử lý chưa hoàn thành đầy đủ,   bao gồm cả hoạt động I / O đến process.stdout và process.stderr.

Trong hầu hết các trường hợp, nó không thực sự cần thiết để gọi    process.exit() một cách rõ ràng. Quá trình Node.js sẽ tự thoát ra   nếu không có thêm công việc nào đang chờ xử lý trong vòng lặp sự kiện. Các    process.exitCode tài sản có thể được thiết lập để nói cho quá trình mà thoát   mã để sử dụng khi quá trình thoát ra một cách duyên dáng.

Hãy xem xét các lý do có thể xảy ra tại sao bạn có thể sẵn sàng thoát khỏi quá trình node.js và tại sao bạn nên tránh process.exit():

Trường hợp 1 - Hoàn tất thực thi (tập lệnh dòng lệnh)

Nếu tập lệnh đã đạt đến trình thông dịch kết thúc và nút không thoát, nó cho biết rằng một số thao tác không đồng bộ vẫn đang chờ xử lý. Việc buộc chấm dứt quá trình với quy trình là sai process.exit() tại điểm này. Tốt hơn là cố gắng hiểu những gì đang giữ kịch bản của bạn thoát ra theo cách dự kiến. Và khi bạn giải quyết vấn đề này, bạn có thể sử dụng process.exitCodeđể trả lại bất kỳ kết quả nào cho quá trình gọi điện.

Trường hợp 2 - Chấm dứt do tín hiệu bên ngoài (SIGINT / SIGTERM / khác)

Ví dụ: nếu bạn sẵn sàng tắt một cách duyên dáng bày tỏ ứng dụng. Không giống như tập lệnh dòng lệnh, ứng dụng tốc hành tiếp tục chạy vô hạn, chờ các yêu cầu mới. process.exit() sẽ là một tùy chọn không hợp lệ ở đây vì nó sẽ làm gián đoạn tất cả các yêu cầu đang ở trong đường ống. Và một số trong số đó có thể không phải là không đáng giá (UPDATE, DELETE). Khách hàng sẽ không bao giờ biết nếu những yêu cầu đó được hoàn thành hay không ở phía máy chủ và có thể đó là lý do dữ liệu không thống nhất giữa máy khách và máy chủ. Giải pháp duy nhất tốt là yêu cầu máy chủ http ngừng chấp nhận các yêu cầu mới và đợi cho các yêu cầu đang chờ xử lý kết thúc bằng server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Nếu vẫn không thoát - hãy xem Trường hợp 1.

Trường hợp 3 - Lỗi nội bộ

Nó luôn luôn tốt hơn để throw một lỗi, bạn sẽ nhận được một dấu vết ngăn xếp được định dạng độc đáo và thông báo lỗi. Các mức mã cao hơn luôn có thể quyết định xem chúng có thể xử lý lỗi hay không (catch) hoặc để cho nó sụp đổ quá trình. Mặt khác, process.exit(1) sẽ chấm dứt quá trình âm thầm và sẽ không có cơ hội để phục hồi từ điều này. Nó có thể là "lợi ích" duy nhất của process.exit(), bạn có thể chắc chắn rằng quá trình đó sẽ bị chấm dứt.


55
2018-02-06 17:38



Phản ứng tuyệt vời. Process.exit() trông giống như overkill lớn cho hầu hết các ứng dụng. Tôi đang tìm kiếm một hàm tương đương với hàm die () của php ... giống như: throw new Error('die msg') - AvadData
Nếu có một chuỗi mã được yêu cầu thực hiện liên tục cho đến khi nhận được yêu cầu tắt máy, có bất kỳ quy ước tốt nào để đăng ký sự kiện cho phép đăng ký bị hủy theo yêu cầu tắt hay không, không yêu cầu mã sử dụng sự kiện hoặc mã yêu cầu tắt máy có kiến ​​thức cụ thể về nhau? Thật không may, cách duy nhất tôi có thể nghĩ đến việc thực hiện kinda-sorta đó là yêu cầu bất kỳ đoạn mã nào đăng ký một sự kiện cũng tạo ra một trình bao bọc bao gồm một đóng cửa để hủy đăng ký nó. - supercat


REPL(Dòng lệnh)

  • nhấn ctrl + c  hai lần

  • Kiểu .exit và nhấn enter

Tập kịch bản

process.exit(code)

Nút thường thoát với mã 0 khi không còn hoạt động không đồng bộ nào đang chờ xử lý.

process.exit(1) nên được sử dụng để thoát với một mã lỗi. Điều này sẽ cho phép chúng tôi suy ra rằng nút không đóng một cách duyên dáng và buộc phải đóng.

Có các mã thoát khác như

3 - Lỗi phân tích cú pháp JavaScript nội bộ (rất rất hiếm)

5 - Lỗi nghiêm trọng trong công cụ javascript v8

9 - Đối số không hợp lệ

Để xem danh sách đầy đủ, hãy xem mã thoát nút


22
2018-02-09 05:36





Tôi có một ứng dụng mà tôi muốn:

  1. Gửi email cho người dùng
  2. Thoát với mã lỗi

Tôi phải móc process.exit(code) đến một exit xử lý sự kiện, nếu không thư sẽ không được gửi kể từ khi gọi process.exit(code) trực tiếp giết chết các sự kiện không đồng bộ.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });

12
2017-12-06 01:15



Tôi nghĩ bạn muốn process.exitCode - Julian de Bhal
Đối với các hồ sơ: Tôi đã dành một đoạn tốt trong ngày cố gắng để có được process.exitCode để làm việc cho tôi trong một công cụ dòng lệnh tôi đang xây dựng (thử nghiệm trên Node v4.3.0). Nhưng tôi không thể làm cho nó hoạt động như tài liệu. Điều này rất tốt có thể là một trường hợp cạnh với commander- mặc dầu github.com/tj/commander.js/… làm tôi tự hỏi. Không chắc chắn nếu có ai khác ra có thấy vấn đề này w / Node 4, nhưng tài liệu chỉ trong trường hợp để tham khảo trong tương lai. - mikermcneil
tái khả năng điều này đến từ chỉ huy, tôi cũng nhìn vào chỉ dep của nó (github.com/zhiyelee/graceful-readlink/…) nhưng không có súc sắc. Chỉ có thể thủ phạm có vẻ như có thể: github.com/tj/commander.js/blob/…  Cụ thể, vấn đề là, ngay cả khi bạn đặt process.exitCode = 1, quá trình thoát với mã 0. - mikermcneil


Từ mã bạn có thể sử dụng process.exit([errorcode]) Ở đâu [errorcode] là một số nguyên tùy chọn (0 là mặc định để biểu thị thành công).

Nếu bạn đang sử dụng Đọc Đánh giá vòng lặp in (REPL), bạn có thể dùng Ctrl + Dhoặc loại .exit

Ngoài ra, trên Windows hoặc Linux, bạn có thể sử dụng Ctrl + C, Ctrl + C

Trên Mac lệnh là Ctrl + Z, Ctrl + Z


6
2018-06-10 01:05



Hai công việc của c kiểm soát trên mac, quá ít nhất là trên tôi với node --version  v0.10.18 - msouth


Như @Dominic đã chỉ ra, ném một lỗi vô ích thực hành tốt hơn thay vì gọi process.exit ([code]):
process.exitCode = 1; throw new Error("my module xx condition failed");


6
2017-10-26 20:10



Thực hiện trong bối cảnh của câu hỏi "Làm thế nào để thoát ra trong Node.js", đây là lời khuyên khủng khiếp. Đề xuất của bạn sẽ có ý nghĩa hơn nhiều nếu câu hỏi được đặt ra cụ thể cách thoát khỏi lỗi. Tôi đặc biệt khuyên bạn nên viết câu trả lời của mình theo cách để chỉ ra rằng người dùng thực hiện như bạn đề xuất, chỉ khi họ đang cố gắng thoát khỏi ứng dụng trong trường hợp có lỗi. - rstackhouse
@rstackhouse, tôi hy vọng bạn đã trải qua ném một lỗi vô ích trỏ đến -> nodejs.org/api/process.html#process_process_exit_code - MANN
Vấn đề với ném là xấu xí như dấu vết stack địa ngục. Bất kỳ mẹo nào để tránh dấu vết ngăn xếp này (không liên quan khi công cụ CLI muốn thoát nếu sử dụng không chính xác)? - MoOx