Как запретить узлу регистрировать исключение на консоли в моем приложении NextJS / Express? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть приложение Express, которое ведет блог в приложении NextJS, очень похожее на пример в их репозитории

Я настроил его так, чтобы мое приложение запускало запрос кполучить статью в блоге, и если результат будет пустым, выдается NotFoundException.

. Я ловлю это исключение в моем файле NextJS _error.js, который похож на границу ошибки React, где я направляю пользователя на мою страницу 404.Эта часть работает нормально.

Проблема, с которой я столкнулся, заключается в том, что это исключение регистрируется на консоли узла, даже если я не регистрирую его при перехвате исключения.Это загрязняет программное обеспечение нашей компании для ведения журналов всеми нашими 404

Есть ли какая-то настройка узла / экспресса, которую я здесь упускаю, которая предотвращает регистрацию исключений?Вот мой обработчик ошибок процесса Express:

process.on('unhandledRejection', (reason, promise) =>
    console.error(`Unhandled Rejection at: ${promise}.\nreason: ${reason.stack || reason}`));

Я знаю, что там есть журнал, но формат того, который я хочу удалить, отличается от этого, поэтому я уверен, что это не источник.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я не буду притворяться, что знаю, что происходит, но я думаю, что next.js где-то регистрирует ошибку.Я немного покопался, и кажется, что в коде сервера есть регистратор ошибок, который будет регистрировать ошибки, если на сервере не установлено свойство quiet:

https://github.com/zeit/next.js/blob/canary/packages/next-server/server/next-server.ts#L105:

return this.run(req, res, parsedUrl)
   .catch((err) => {
   this.logError(err)
    res.statusCode = 500
    res.end('Internal Server Error')
})

Вот sig и body для функции logError:

private logError(...args: any): void {
  if (this.quiet) return
  // tslint:disable-next-line
  console.error(...args)
}

Если вы посмотрите на документацию по использованию следующего API с настраиваемым сервером, то обратите внимание на следующие свойства объекта параметров, которые можно передать конструктору:

Следующий API выглядит следующим образом:

next (opts: object) Поддерживаемые параметры:

  • dev (bool), запускать лиNext.js в режиме разработки - по умолчанию false

  • dir (строка), где расположен следующий проект - по умолчанию '.'

  • quiet (bool) Скрыть сообщения об ошибках, содержащие информацию о сервере - по умолчанию false

  • conf (объект) тот же объект, который вы будете использовать в next.config.js - по умолчанию {}

При создании следующего объекта попробуйте передать значение quiet как true, чтобы увидеть,t решает вашу проблему:

const express = require('express')
const next = require('next')

const port = parseInt(process.env.PORT, 10) || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev, quiet: true })
const handle = app.getRequestHandler()

В документах также упоминается, что ошибки регистрируются в непроизводственных средах (определяется при process.env.NODE_ENV !== 'production'), поэтому я также хотел бы убедиться, что вы устанавливаете NODE_ENV в «производство»при запуске приложения:

NODE_ENV=production node server.js

Надеюсь, это поможет!

0 голосов
/ 22 февраля 2019

В экспресс вы можете установить ErrorMiddleware.После объявления всех маршрутов поставьте

 server.use(function(req, res, next) {
  handler(req, res).catch(e => {
    // use rejected promise to forward error to next express middleware
    next(e)
  })
});

Таким образом, когда вы отклоняете обещание, next (e) отправит вашу ошибку следующему промежуточному программному обеспечению.Обычно я устанавливаю промежуточное программное обеспечение, в которое отправляю ошибку, а затем управляю всеми ошибками в одной функции (на основе ошибки statusCode, ...).

...