javascript - 如何允许通过快递处理程序?
问题描述
我有一个POST
api 端点可以/users
用来获取用户列表。
这是POST
因为请求的正文非常庞大,可能不适合GET
请求的 url。
假设用户的主体POST
有一个名为的键age
,它应该给我一定年龄的用户,即一种过滤
现在在快递我有类似的路线
app.post('/users', function(r,res){
// function body
})
而且我实际上不能在该函数体内放置任何代码
所以我能够通过使用另外一个处理程序/users
并将其放在原始处理程序之前来拦截请求,但显然它拦截了所有/users
请求并破坏了早期的功能
我怎样才能只拦截具有特定年龄的请求,然后将其他请求传递给原始处理程序,以便原始功能继续工作?
我想知道如何使用路由处理程序而不是中间件来做到这一点?
我也不能弄乱 url 或请求正文
解决方案
首先,这听起来像是一个非常糟糕的设计,因此修复问题的更好方法是修复 URL 设计,这样您就不会在可以修改和不能修改的代码之间发生冲突。我这样说是因为听起来您是在尝试“破解”某些东西,而不是做出正确的设计。
如果您的代码使用常规的正文解析器中间件,那么帖子的正文将已经被解析并在req.body
. 因此,您可以在其中查找所需的参数req.body.age
并检查其值。
如果它符合您的标准,那么您可以处理请求并完成。如果它不满足您的请求,那么您调用next()
以继续处理其他请求处理程序。
// make sure this is defined BEFORE other /users request handlers
app.post('/users', function(req, res, next) {
// test some condition here
if (+req.body.age > 30) {
// process the request and send a response
res.send("You're too old");
} else {
// continue processing to other request handlers
next();
}
})
推荐阅读
- r - 如何在 Rmarkdown 文件和 Rmarkdown html 文档中设置绘图的缩放、适合、分辨率?
- android - 具有多种样式的Android格式TextView
- android - 有什么方法可以替换通过 intel webrtc android sdk 发布自定义数据,而不是相机数据?
- html - 如何使用相对和绝对定位来定位 div
- conda - 覆盖旧输出文件的蛇形
- flutter - 参数类型“SubscriptionList”不能分配给参数类型“SubscriptionsList”
- unity3d - 如何在 x 位置之间平滑移动角色控制器,如 Unity 中的地铁冲浪者?
- sql - 连接具有相同数据的不同列的表
- ios - iOS14 小部件没有动态变化
- wcf - WCF 中的 SOAP 标头是否安全?