【发布时间】:2026-01-23 09:55:01
【问题描述】:
我正在使用 Express 框架,并且我的一个路由文件中有以下内容:
var allUsersFromDynamoDb = function (req, res) {
var dynamodbDoc = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: "users",
ProjectionExpression: "username,loc,age"
};
dynamodbDoc.scan(params, function (err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err));
res.statusCode = 500;
res.send("Internal Server Error");
} else {
console.log("DynamoDB Query succeeded.");
res.end(JSON.stringify(data.Items));
}
});
}
我正在我的一条路线中使用上述功能:
router.get('/users', allUsersFromDynamoDb);
现在,我在调用 dynamodbDoc 上的“扫描”时定义的回调如果定义为单独的函数会非常有用。我也可以将它重新用于我的其他一些路线。
但是我怎样才能访问这个新函数中的“res”呢?
我认为我应该使用“闭包”,但我似乎无法完全正确。我想我需要维护新回调函数的签名以期望 2 个参数,“err”和“data”,如下页所示:
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property
关于如何做到这一点的任何想法?
【问题讨论】:
-
我认为您可以将回调放入它自己的命名函数中,只要它与调用
dynamodbDoc.scan的范围相同。在这里,由于 JS 的closure特性,您的回调将可以访问与dynamodbDoc.scan相同的res对象。 -
哦,是的,这是一个选项。我实际上应该在我的问题描述中提到这一点。但如果我这样做,那么该回调函数将在“allUserFromDynamoDB”函数之外不可用。假设我有另一个函数(用于不同的路线)“getSpecificUserFromDynamoDB”,我也想在其中使用它。希望我的意思很清楚。
-
问题是如果回调函数定义在
allUsersFromDynamoDb的范围之外,那么它就无法访问res或req`对象。您可以找到我认为的解决方法(取决于具体用途)。