Hướng dẫn nodejs throw error and exit - lỗi ném nodejs và thoát

15

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi có một tập lệnh Node.js thực hiện một số đăng nhập vào một tệp bằng WritStream. Trên một số sự kiện nhất định, tôi muốn ngừng thực hiện tập lệnh, tức là cảnh báo đăng nhập và thoát ngay sau đó. Trở thành Node.js không hợp lý không cho phép chúng ta thực hiện nó thẳng như:

#!/usr/local/bin/node

var fs = require('fs');
var stream = fs.createWriteStream('delme.log', { flags: 'a' });

stream.write('Something bad happened\n');
process.exit(1);

Thay vì nối thêm một thông báo vào Delme.log tập lệnh này không có gì với tệp. Xử lý sự kiện 'Thoát' và Flushing không hoạt động. Cách duy nhất để viết thông báo nhật ký cuối cùng trước khi thoát được tìm thấy cho đến nay là kết thúc process.exit(1) trong setTimeout():

#!/usr/local/bin/node

var fs = require('fs');
var stream = fs.createWriteStream('delme.log', { flags: 'a' });

stream.write('Something bad happened\n');
setTimeout(function(){
  process.exit(1);
}, 30);

Tuy nhiên, trong biểu mẫu này, nó không dừng thực thi tập lệnh ngay lập tức và tập lệnh sẽ chạy một thời gian sau khi sự kiện quan trọng xảy ra. Vì vậy, tôi đang tự hỏi nếu có những cách khác để thoát một tập lệnh bằng tin nhắn nhật ký?

hỏi ngày 8 tháng 2 năm 2012 lúc 10:10Feb 8, 2012 at 10:10

Hướng dẫn nodejs throw error and exit - lỗi ném nodejs và thoát

Vì bạn muốn chặn và đã sử dụng một luồng, có lẽ bạn sẽ muốn tự mình xử lý việc viết.

var data = new Buffer('Something bad happened\n');
fs.writeSync(stream.fd, data, 0, data.length, stream.pos);
process.exit();

Đã trả lời ngày 8 tháng 2 năm 2012 lúc 10:20Feb 8, 2012 at 10:20

fentfentfent

17.6K15 Huy hiệu vàng85 Huy hiệu bạc91 Huy hiệu Đồng15 gold badges85 silver badges91 bronze badges

2

Improved.

var fs = require('fs');
var stream = fs.createWriteStream('delme.log', {flags: 'a'});

// Gracefully close log
process.on('uncaughtException', function () {
    stream.write('\n'); // Make sure drain event will fire (queue may be empty!)
    stream.on('drain', function() {
        process.exit(1);
    });
});

// Any code goes here...
stream.write('Something bad happened\n');
throw new Error(SOMETHING_BAD);

Khối thử thử hoạt động nhưng nó xấu. Tuy nhiên, tín dụng đi @nab, tôi chỉ cần trang trí nó.

Đã trả lời ngày 11 tháng 1 năm 2013 lúc 21:19Jan 11, 2013 at 21:19

Zupazupazupa

12.4K5 Huy hiệu vàng39 Huy hiệu bạc39 Huy hiệu đồng5 gold badges39 silver badges39 bronze badges

Tôi nghĩ rằng đây là cách đúng:

process.on('exit', function (){
  // You need to use a synchronous, blocking function, here.
  // Not streams or even console.log, which are non-blocking.
  console.error('Something bad happened\n');
});

Đã trả lời ngày 8 tháng 2 năm 2012 lúc 12:24Feb 8, 2012 at 12:24

Danmactoughdanmactoughdanmactough

5.3452 Huy hiệu vàng20 Huy hiệu bạc22 Huy hiệu Đồng2 gold badges20 silver badges22 bronze badges

Để xóa tất cả các thông báo nhật ký vào một tệp trước khi thoát, người ta có thể muốn kết thúc việc thực thi tập lệnh trong một khối thử. Một khi điều gì đó tồi tệ đã xảy ra, nó đã được ghi lại và ném một ngoại lệ sẽ bị bắt bởi ____99 bên ngoài mà từ đó an toàn để thoát khỏi sự không đồng bộ:

#!/usr/local/bin/node

var fs = require('fs');
var stream = fs.createWriteStream('delme.log', { flags: 'a' });
var SOMETHING_BAD = 'Die now';

try {
  // Any code goes here...
  if (somethingIsBad) {
    stream.write('Something bad happened\n');
    throw new Error(SOMETHING_BAD);
  }
} catch (e) {
  if (e.message === SOMETHING_BAD) {
    stream.on('drain', function () {
      process.exit(1);
    });
  } else {
     throw e;
  }
}

Đã trả lời ngày 8 tháng 2 năm 2012 lúc 22:38Feb 8, 2012 at 22:38

nabnabnab

4.6714 Huy hiệu vàng30 Huy hiệu bạc42 Huy hiệu Đồng4 gold badges30 silver badges42 bronze badges

Tôi sẽ ủng hộ chỉ viết cho Stderr trong sự kiện này - ví dụ: ví dụ tầm thường

console.error(util.inspect(exception));

Và sau đó để quá trình giám sát* xử lý sự kiên trì của nhật ký. Từ sự hiểu biết của tôi ngày nay, bạn không phải lo lắng về stdout và stderr không xả nước trước khi thoát khỏi nút (mặc dù tôi đã thấy hành vi ngược lại có vấn đề trong một số phiên bản 0.2.x).

.

Điều này cũng cung cấp một con đường sạch để sử dụng các nhà cung cấp PAA như Heroku và DotCloud, v.v.

Đã trả lời ngày 8 tháng 2 năm 2012 lúc 10:38Feb 8, 2012 at 10:38

Hướng dẫn nodejs throw error and exit - lỗi ném nodejs và thoát

Mâtt Frëmanmâtt FrëëmanMâtt Frëëman

1.3299 huy hiệu bạc20 Huy hiệu đồng9 silver badges20 bronze badges

1

Ném lỗi mới có dừng thực thi không?

Tuyên bố ném ném một ngoại lệ do người dùng xác định.Việc thực hiện chức năng hiện tại sẽ dừng (các câu lệnh sau khi ném sẽ không được thực thi) và điều khiển sẽ được chuyển đến khối bắt đầu tiên trong ngăn xếp cuộc gọi.Execution of the current function will stop (the statements after throw won't be executed), and control will be passed to the first catch block in the call stack.

Làm thế nào để bạn thoát khỏi một quy trình nodejs?

Phương pháp 1: Sử dụng phím Ctrl+C: Khi chạy chương trình NodeJS trong bảng điều khiển, bạn có thể đóng nó bằng Ctrl+C trực tiếp từ bảng điều khiển với việc thay đổi mã hiển thị bên dưới: Phương pháp 2: Sử dụng quy trình.Hàm EXIT (): Hàm này cho Node.JS để kết thúc quá trình đang chạy cùng một lúc với mã thoát.Using ctrl+C key: When running a program of NodeJS in the console, you can close it with ctrl+C directly from the console with changing the code shown below: Method 2: Using process. exit() Function: This function tells Node. js to end the process which is running at the same time with an exit code.

Các mã thoát của Node JS là gì?

Node thường thoát với mã 0 khi không còn hoạt động Async đang chờ xử lý.Process.exit (1) nên được sử dụng để thoát với mã lỗi.process. exit(1) should be used to exit with a failure code.

Làm cách nào để thoát Node JS trong thiết bị đầu cuối?

Nhấn Ctrl+ C (ngay cả trên máy Mac, đặc biệt là trên máy Mac!) Hoặc chỉ gọi quy trình.phương thức thoát () để thoát khỏi bảng điều khiển nút.