代码之家  ›  专栏  ›  技术社区  ›  Carwyn Stephen

如何防止node在我的NextJS/Express应用程序中将异常记录到控制台?

  •  0
  • Carwyn Stephen  · 技术社区  · 7 年前

    我有一个Express应用程序,它在NextJS应用程序中运行一个博客,非常类似于 example in their repo

    NotFoundException .

    我在我的电脑里发现了这个异常 NextJS _error.js

    我遇到的问题是,此异常被记录到节点控制台,即使捕获异常时我没有记录它。这污染了我们公司的所有404的日志软件

    这里是否缺少阻止记录异常的node/express设置?以下是我的快速流程错误处理程序:

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

    我知道那里有一个日志,但是我想删除的日志的格式与此不同,所以我相信这不是源代码。

    0 回复  |  直到 7 年前
        1
  •  4
  •   willascend    7 年前

    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')
    })
    

    以下是logError函数的sig和主体:

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

    下一个API如下所示:

    下一步(选项:对象)

    • dev(bool)是否在dev模式下启动Next.js-默认为false

    • 下一个项目所在的目录(字符串)-默认值“.”

    • conf(object)您将在next.config.js中使用的同一个对象-default{}

    构造下一个对象时,请尝试将quiet作为true传递,以查看它是否解决了您的问题:

    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=production node server.js
    

    我希望这有帮助!

        2
  •  -1
  •   MatteoPHRE    7 年前

    在express中,您可以设置错误中间件。

     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)将把您的错误发送给next中间件。我通常设置一个发送错误的中间件,然后在一个函数中管理所有错误(基于statusCode error…)。