[英]How can I write a route in express to perform middleware validation and then return data to user?
我的目标是让 angular 调用 Express API。 然后 API 将使用中间件来验证请求标头中的令牌。 如果令牌通过,我希望它然后运行一个函数来执行预期的 GET 并从数据库返回数据。
const express = require('express'); const router = new express.Router(); // Middleware that will return a status of 200 if sucessful var authMiddleware = require('../middleware/AuthMiddleware.js'); // Controller that calls the db_api file which queries the DB const o_l_vfn = require('../controllers/o_l_vfn.js'); // What I am doing currently that is not working router.get('/o_l_vfn', authMiddleware.Validate, o_l_vfn.get); //Currently getting an error of: // ERROR FOUND o_l_vfn: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client module.exports = router;
有关如何编写 express middlwares https://expressjs.com/en/guide/writing-middleware.html的指南,请参阅此指南,这是一个非常好的指南,应该非常有帮助。
不过,这是一个简短的答案,编写中间件很简单。 下面是一个例子:
function authMiddleware(req, res, next) {
// Write your logic here
console.log('This is a middleware!!!')
next()
}
现在在你的快递应用中做这样的事情
...
app.use(authMiddleware)
...
上面的代码段将在每条路线之前运行您的代码,如果您只想在特定路线之前编写此代码,请执行类似于以下的操作
app.get('/', authMiddleware, (req, res) => {
// Run your endpoint logic here
res.status(200).end()
})
中间件永远不应该返回成功状态! 在你的代码中它说
// 如果成功,中间件将返回 200 状态
这是错误的,中间件就像瀑布,它们会做一些事情,但除了无效状态之外不应该返回状态,如果一切成功,他们应该调用 next() 以便下一个函数可以在您的情况下运行,它是控制器。 如果出现无效状态(例如无效令牌),那么您的中间件应返回某种状态代码,例如 400。
表达验证中间件逻辑的更好方法是,如果身份验证令牌有效,则让它传递给 next()。 或者,如果身份验证令牌不正确,则提前停止处理并以 401 Unauthorized 响应。
现在您遇到了两次响应问题:首先是在 auth 中间件中,然后是在控制器中。 如果您遵循建议的逻辑,则服务器在快乐路径和未经授权的情况下仅响应一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.