Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express中间件在Next.js自定义服务器中记录错误_Javascript_Node.js_Express_Next.js_Sentry - Fatal编程技术网

Javascript Express中间件在Next.js自定义服务器中记录错误

Javascript Express中间件在Next.js自定义服务器中记录错误,javascript,node.js,express,next.js,sentry,Javascript,Node.js,Express,Next.js,Sentry,我不知道如何使用express中间件将错误记录到Sentry,使用: Next.js v9.0.5 Express v4.17.1 哨兵/节点v“5.6.2 我尝试了不同的中间件版本,结果不同。但是,没有一个是预期的行为 尝试1: function logError(err, req, res, next) { Sentry.captureMessage(`${err.stack} - ${err.message}`) Sentry.captureException(err) c

我不知道如何使用express中间件将错误记录到Sentry,使用:

  • Next.js v9.0.5
  • Express v4.17.1
  • 哨兵/节点v“5.6.2
我尝试了不同的中间件版本,结果不同。但是,没有一个是预期的行为

尝试1

function logError(err, req, res, next) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  next(err)
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Just removing this line from Try 1
  // next(err) 
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Send an error instead of call next(err)
  res.statusCode = 500
  res.send('Internal server error')
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Throw the error instead of call next(err)
  throw new Error(err)
}
这不是调用sentry方法,也不是执行
console.log('Error reported to sentry')
,就像直接进入
next(err)
而不执行此中间件的任何代码一样

试试2

function logError(err, req, res, next) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  next(err)
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Just removing this line from Try 1
  // next(err) 
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Send an error instead of call next(err)
  res.statusCode = 500
  res.send('Internal server error')
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Throw the error instead of call next(err)
  throw new Error(err)
}
现在,当出现错误时,正在执行我的代码!正在登录Sentry并执行控制台.log('error reported to Sentry')!但是,当我进入失败的页面时,请求看起来像是永远挂起,没有任何响应。这不是我想要的

尝试3次:

function logError(err, req, res, next) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  next(err)
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Just removing this line from Try 1
  // next(err) 
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Send an error instead of call next(err)
  res.statusCode = 500
  res.send('Internal server error')
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Throw the error instead of call next(err)
  throw new Error(err)
}
与Try 1相同的结果+奖励:
TypeError:res.send不是一个函数
。什么

尝试3次:

function logError(err, req, res, next) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  next(err)
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Just removing this line from Try 1
  // next(err) 
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Send an error instead of call next(err)
  res.statusCode = 500
  res.send('Internal server error')
}
function logError(err, req, res) {
  Sentry.captureMessage(`${err.stack} - ${err.message}`)
  Sentry.captureException(err)
  console.log('Error reported to sentry.')

  // Throw the error instead of call next(err)
  throw new Error(err)
}
这是我期望的最接近的一个。正在调用我的中间件代码向Sentry报告错误+请求不会永远挂起。不过,错误堆栈很奇怪:

错误:[对象]
在logError(/server/logger.js:43:9)


我的问题是:

  • 如何才能正确地执行此操作
  • 这是怎么回事?错误中间件在express/next.js下是如何工作的

您使用的是
sentry/node
?这样您就可以使用默认的中间件
app.use(sentry.Handlers.requestHandler());
app.use(sentry.Handlers.errorHandler());
或者在您的路由中捕获错误和`sentry.captureException(e)`