Node.js 如何在express中编写路由以执行中间件验证,然后将数据返回给用户?

Node.js 如何在express中编写路由以执行中间件验证,然后将数据返回给用户?,node.js,express,get,middleware,router,Node.js,Express,Get,Middleware,Router,我的目标是让angular调用Express API。然后,API将使用中间件验证来自请求头的令牌。如果令牌通过,我希望它运行一个函数,执行预期的GET并从数据库返回数据 const express=require('express'); const router=new express.router(); //如果成功,将返回状态为200的中间件 var authMiddleware=require('../middleware/authMiddleware.js'); //调用查询数据库的

我的目标是让angular调用Express API。然后,API将使用中间件验证来自请求头的令牌。如果令牌通过,我希望它运行一个函数,执行预期的GET并从数据库返回数据

const express=require('express');
const router=new express.router();
//如果成功,将返回状态为200的中间件
var authMiddleware=require('../middleware/authMiddleware.js');
//调用查询数据库的db_api文件的控制器
const o_l_vfn=require('../controllers/o_l_vfn.js');
//我目前正在做的事情不起作用
get('/o_l_vfn',authMiddleware.Validate,o_l_vfn.get);
//当前获取的错误为:
//发现o_l_vfn错误:错误[ERR_HTTP_HEADERS\u SENT]:发送到客户端后无法设置头

module.exports=路由器有关如何编写express middlwares的指南,请参阅此指南。这是一个非常好的指南,应该会非常有用

下面是简短的答案,编写中间件很简单。以下是一个例子:

function authMiddleware(req, res, next) {
      // Write your logic here
      console.log('This is a middleware!!!')
      next()
}
现在,在您的express应用程序中执行以下操作

...

app.use(authMiddleware)
...
上面的代码片段将在每个路由之前运行您的代码,如果您只想在特定路由之前编写此代码,请执行以下类似操作

app.get('/', authMiddleware, (req, res) => {
    // Run your endpoint logic here
    res.status(200).end()
})
中间件永远不会返回成功状态!在你的代码中它说

//如果成功,将返回状态为200的中间件


这是错误的,中间件就像瀑布一样,它们会做一些事情,但不应该返回除无效状态以外的状态,如果一切成功,它们应该调用next(),以便下一个函数可以在您的情况下运行,即控制器。如果出现无效状态,如无效令牌,则中间件应返回某种状态代码,如400。

有关如何编写express middlwares的指南,请参阅此指南。这是一个非常好的指南,应该非常有用

下面是简短的答案,编写中间件很简单。以下是一个例子:

function authMiddleware(req, res, next) {
      // Write your logic here
      console.log('This is a middleware!!!')
      next()
}
现在,在您的express应用程序中执行以下操作

...

app.use(authMiddleware)
...
上面的代码片段将在每个路由之前运行您的代码,如果您只想在特定路由之前编写此代码,请执行以下类似操作

app.get('/', authMiddleware, (req, res) => {
    // Run your endpoint logic here
    res.status(200).end()
})
中间件永远不会返回成功状态!在你的代码中它说

//如果成功,将返回状态为200的中间件


这是错误的,中间件就像瀑布一样,它们会做一些事情,但不应该返回除无效状态以外的状态,如果一切成功,它们应该调用next(),以便下一个函数可以在您的情况下运行,即控制器。如果出现无效状态(如invalid token),则中间件应返回某种状态代码(如400)。

表示验证中间件逻辑的更好方法是,如果auth token有效,则将其传递给next()。或者,如果身份验证令牌不正常,则提前停止处理并使用401 Unauthorized进行响应


现在,您在响应两次时遇到了麻烦:首先在auth中间件中,然后在控制器中。如果您遵循建议的逻辑,则服务器在愉快路径和未经授权的情况下只响应一次。

表达验证中间件逻辑的更好方法是,如果验证令牌有效,则让它传递到next()。或者,如果身份验证令牌不正常,则提前停止处理并使用401 Unauthorized进行响应


现在,您在响应两次时遇到了麻烦:首先在auth中间件中,然后在控制器中。如果按照建议的逻辑操作,服务器在愉快路径和未经授权的情况下只响应一次。

我发布了一个关于如何编写中间件的答案,但是,我只是注意到了错误的注释。如果您发布实际的中间件和实际的控制器,这将是非常有帮助的。我发布了一个关于如何编写中间件的答案,但是,我只是注意到了错误的注释。如果您发布实际的中间件和实际的控制器,这将非常有帮助。非常感谢您的详细回复。没问题,我很高兴。非常感谢您的详细回复。没问题,我很高兴。