如何允许快递处理程序通过?
how to allow pass through in express handlers?
我有一个POST
api端点可以说/users
来获取用户列表。
它是 POST
因为请求的正文非常大,可能不适合 GET
请求的 url。
假设用户 POST
的主体有一个名为 age
的密钥,它应该给我特定年龄的用户,即某种过滤
现在在快递中我有像
这样的路线
app.post('/users', function(r,res){
// function body
})
而且我实际上不能在该函数体中放入任何代码
所以我能够通过为 /users
使用另一个处理程序并将其放在原始处理程序之前来拦截请求,但显然它拦截了所有 /users
请求并破坏了早期的功能
我如何才能只拦截具有特定年龄的请求,然后将其他请求传递给原始处理程序,以便原始功能继续工作?
我想知道如何使用路由处理程序而不是中间件来做到这一点?
我不能弄乱 url 或请求正文也
首先,这听起来像是一个非常糟糕的设计,所以真正解决问题的更好方法是只修复 URL 设计,这样您就不会在可以和不能的代码之间产生这种冲突调整。我这样说是因为听起来您正试图 "hack" 做一些事情而不是进行适当的设计。
如果您的代码使用常规的主体解析器中间件,那么 post 的主体将已经被解析并在 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();
}
})
我处理这个问题的方法是,如果我有一条可行的路线,而我需要其他东西,我会添加另一条类似的路线。通过这种方式,您可以不理会原件 - 它提供了有效的服务。这就是我认为您正在描述的内容。
您可以随意调用路由。如果你想要一个用户列表,你可以像这样传递一个变量:
$.get('/contactCard/'+qry);
app.get('/contactCard/:sort', function(req, res) {
var cId = req.params.sort;
console.log('cId: ' + cId);
然后设置搜索查询并像这样获取数据:
let params = {
TableName: ddbTable,
ProjectionExpression : "cEmail,Forename,Surname",
KeyConditionExpression: "ID = :e ",
ExpressionAttributeValues: {
":e" : cId
}
};
console.log("params", JSON.stringify(params, null, 2));
docClient.query(params, function(err, data) {
然后你检查错误或成功:
if (err) {
console.log("Error:", JSON.stringify(err, null, 2));
} else {
console.log("Success", JSON.stringify(data, null, 2));
let contacts = data;
然后在此处呈现您想要的页面并按您的意愿传递数据。
res.render('members/contactcard', {
contacts:contacts,
static_path: '/static'
});
}
});
我有一个POST
api端点可以说/users
来获取用户列表。
它是 POST
因为请求的正文非常大,可能不适合 GET
请求的 url。
假设用户 POST
的主体有一个名为 age
的密钥,它应该给我特定年龄的用户,即某种过滤
现在在快递中我有像
这样的路线app.post('/users', function(r,res){
// function body
})
而且我实际上不能在该函数体中放入任何代码
所以我能够通过为 /users
使用另一个处理程序并将其放在原始处理程序之前来拦截请求,但显然它拦截了所有 /users
请求并破坏了早期的功能
我如何才能只拦截具有特定年龄的请求,然后将其他请求传递给原始处理程序,以便原始功能继续工作?
我想知道如何使用路由处理程序而不是中间件来做到这一点?
我不能弄乱 url 或请求正文也
首先,这听起来像是一个非常糟糕的设计,所以真正解决问题的更好方法是只修复 URL 设计,这样您就不会在可以和不能的代码之间产生这种冲突调整。我这样说是因为听起来您正试图 "hack" 做一些事情而不是进行适当的设计。
如果您的代码使用常规的主体解析器中间件,那么 post 的主体将已经被解析并在 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();
}
})
我处理这个问题的方法是,如果我有一条可行的路线,而我需要其他东西,我会添加另一条类似的路线。通过这种方式,您可以不理会原件 - 它提供了有效的服务。这就是我认为您正在描述的内容。
您可以随意调用路由。如果你想要一个用户列表,你可以像这样传递一个变量:
$.get('/contactCard/'+qry);
app.get('/contactCard/:sort', function(req, res) {
var cId = req.params.sort;
console.log('cId: ' + cId);
然后设置搜索查询并像这样获取数据:
let params = {
TableName: ddbTable,
ProjectionExpression : "cEmail,Forename,Surname",
KeyConditionExpression: "ID = :e ",
ExpressionAttributeValues: {
":e" : cId
}
};
console.log("params", JSON.stringify(params, null, 2));
docClient.query(params, function(err, data) {
然后你检查错误或成功:
if (err) {
console.log("Error:", JSON.stringify(err, null, 2));
} else {
console.log("Success", JSON.stringify(data, null, 2));
let contacts = data;
然后在此处呈现您想要的页面并按您的意愿传递数据。
res.render('members/contactcard', {
contacts:contacts,
static_path: '/static'
});
}
});