Подтвердить что ты не робот

Node.js Экспресс-приложение запускает ошибки запуска приложения

У меня есть приложение в Node.js и Express. Мне нужно написать для этого тесты. У меня проблема с обработкой ошибок Экспресс-приложений. Я нашел это Как поймать ошибки Node.js/express сервера, такие как EADDRINUSE?, но это не работает для меня, я не знаю почему. Я хочу обрабатывать ошибки, которые могут произойти, когда выполняется выражение expressionApp.listen() (EADDRINUSE, EACCES и т.д.).

express = require('express')
listener = express()

#doesn't work for me
listener.on('uncaughtException', (err) ->
  #do something
)

#doesn't work too
listener.on("error", (err) ->
  #do something
)

#this works, but it caughts all errors in process, I want only in listener
process.on('uncaughtException', (err) ->
  #do something
)

listener.listen(80) #for example 80 to get error

Любые идеи?

4b9b3361

Ответ 1

Во-первых, expressJS не бросает событие uncaughtException, процесс делает, поэтому неудивительно, что ваш код не работает.

Поэтому используйте: process.on('uncaughtException',handler).

Далее, expressJS уже предоставляет стандартные средства обработки ошибок, которые должны использовать функцию промежуточного программного обеспечения, которую он обеспечивает для этой цели, например:

app.configure(function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

Эта функция возвращает сообщение об ошибке клиенту с дополнительным стеклом и документируется в connectJS errorHandler.

(Обратите внимание, что errorHandler на самом деле является частью connectJS и доступен только expressJS.)

Если поведение, предоставленное существующим методом errorHandler, недостаточно для ваших нужд, его источник находится в connectJS errorHandler промежуточном программном обеспечении и может быть легко модифицируется в соответствии с вашими потребностями.

Конечно, вместо того, чтобы напрямую модифицировать эту функцию, "правильный" способ сделать это - создать свой собственный errorHandler, используя версию connectJS в качестве отправной точки, например:

var myErrorHandler = function(err, req, res, next){
    ...
    // note, using the typical middleware pattern, we'd call next() here, but 
    // since this handler is a "provider", i.e. it terminates the request, we 
    // do not.
};

И установите его в expressJS как:

app.configure(function(){
    app.use(myErrorHandler);
});

См. Просто подключите его, уже для объяснения идеи connectJS для filter и provider промежуточного программного обеспечения и Как написать промежуточное программное обеспечение для Connect/Express для хорошо написанного учебника.

Вы также можете найти их полезными:

Наконец, отличный источник информации о тестировании expressJS можно найти в свои собственные тесты.

Ответ 2

Это должно сделать трюк:

listener.listen(80).on('error', function(err) { });

Фактически listener.listen создает HTTP-сервер и вызывает его прослушивание:

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};