节点js参数是如何工作的?

q1qsirdb  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(139)

我在我的项目中看到了这些代码。

当2个参数时:

app.use("*", (req: Request, res: Response) => {
});

当有3个参数时:

app.use("*", (req: Request, res: Response, next: NextFunction) => {
});

当有4个参数时:

app.use("*", (err: any, req: Request, res: Response, next: NextFunction) => {
});

问题1)有没有任何文档说明我们为什么使用err作为第一个参数?我对这种方法感到非常困惑。有多少种类型的争论!?

Q2)我需要在所有回复中添加标题。更准确地说,我需要在响应头中添加CSP。我应该使用中间件方法添加吗,例如,app.use(csp);或任何建议。

q3qa4bjr

q3qa4bjr1#

问题一:

三参数函数是实际的Express中间件,它包含

req:请求对象,res:响应对象,next:下一个函数

next()函数用于将当前流传递到下一个中间件。例如,假设我们有两个中间件。

app.use((req, res, next) => {
    console.log('THis is first Middleware')
    req.nextMiddlewareValue = 'Previous Middleware value'
    /* Code flow will transfer to the next middleware, defined below */
    next()
})

app.use((req, res, next) => {
  // If we try to console te req.nextMiddlewareValue object
  console.log(req.nextMiddlewareValue)    // Previous Middleware value
})

确保两个中间件应同时使用。

四参数功能中间件,基本上是ExpressJS提供的一个错误中间件。ExpressJS Error Handling

对于4个参数的中间件,第一个参数表示错误,让我们再次使用上面的例子

app.use((req, res, next) => {
  /* Do Some Stuff */
  /* Now, instead of changing values, we will pass an error to next function */
  next(new Error('Error Occured in this middleware!'))
  /* Now this error will reach 4 Args middleware, known as error middleware */
})

app.use((err, req, res, next) => {
  /* This middleware handles all errors that will be passed to next() function in any middleware */
  /* Let's console err here */
  console.log(err.message) // Error Occurred in this middleware!
})

确保使用错误中间件来结束所有中间件。

问题二:

如果您想要为res对象设置任何标头,您可以使用如下所示

app.use((req, res, next) => {
  /* Set Header to res object */
  res.set({
    'Content-Type': 'text/plain',
    'Content-Length': '123',
    'ETag': '12345'
  })

  /* and call next function, now this res object will pass to all middlewares after it.*/
  next()
})

确保该中间件高于所有中间件,这样你就可以在任何中间件中访问它,这会将它设置为所有中间件的全局标头

在ExpressJS中设置标头有多种方法。请按照此answer了解更多信息。

我希望这能帮助您了解Express Middleware。

相关问题