如何在 express 中编写路由以执行中间件验证,然后将 return 数据发送给用户?
How can I write a route in express to perform middleware validation and then return data to user?
我的目标是让 angular 呼叫 Express API。然后 API 将使用中间件来验证来自请求 header 的令牌。如果令牌通过,我希望它通过,然后 运行 一个函数执行预期的 GET 和 returns 来自数据库的数据。
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 中间件的指南https://expressjs.com/en/guide/writing-middleware.html这是一个非常好的指南,应该很有帮助。
这里是简短的回答,编写中间件很简单。这是一个例子:
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()
})
中间件永远不会return成功!在你的代码中它说
// Middleware that will return a status of 200 if sucessful
这是错误的,中间件就像瀑布,它们会做一些事情但不应该 return 除了无效状态之外的状态,如果一切成功,它们应该调用 next() 以便下一个函数可以 运行 在你的情况下它是控制器。如果出现无效状态,例如无效令牌,那么您的中间件应该 return 某种状态代码,例如 400。
表达验证中间件逻辑的更好方法是,如果身份验证令牌有效,让它传递给 next()。或者,如果身份验证令牌不正确,则过早停止处理并以 401 Unauthorized 响应。
现在您遇到两次响应问题:首先是在 auth 中间件中,然后是在控制器中。如果您遵循建议的逻辑,服务器在正常路径和未经授权的情况下仅响应一次。
我的目标是让 angular 呼叫 Express API。然后 API 将使用中间件来验证来自请求 header 的令牌。如果令牌通过,我希望它通过,然后 运行 一个函数执行预期的 GET 和 returns 来自数据库的数据。
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 中间件的指南https://expressjs.com/en/guide/writing-middleware.html这是一个非常好的指南,应该很有帮助。
这里是简短的回答,编写中间件很简单。这是一个例子:
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()
})
中间件永远不会return成功!在你的代码中它说
// Middleware that will return a status of 200 if sucessful
这是错误的,中间件就像瀑布,它们会做一些事情但不应该 return 除了无效状态之外的状态,如果一切成功,它们应该调用 next() 以便下一个函数可以 运行 在你的情况下它是控制器。如果出现无效状态,例如无效令牌,那么您的中间件应该 return 某种状态代码,例如 400。
表达验证中间件逻辑的更好方法是,如果身份验证令牌有效,让它传递给 next()。或者,如果身份验证令牌不正确,则过早停止处理并以 401 Unauthorized 响应。
现在您遇到两次响应问题:首先是在 auth 中间件中,然后是在控制器中。如果您遵循建议的逻辑,服务器在正常路径和未经授权的情况下仅响应一次。