我正在使用 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));
}
});
}
我在其中一条 route 使用了上述功能:
router.get('/users', allUsersFromDynamoDb);
现在,如果定义为单独的函数,我在调用 dynamodbDoc 上的“扫描”时定义的回调将非常有用。我也可以将它重新用于我的其他一些路线。
但是我怎样才能仍然访问这个新函数中的“res”呢?
我想我应该使用“闭包”,但我似乎无法完全正确地使用它。我想我需要维护新回调函数的签名以期望 2 个参数,“错误”和“数据”,如下页所示:
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property
关于如何做到这一点有什么想法吗?
最佳答案
您可以将该函数用作您想要的每个路由的中间件http://expressjs.com/en/guide/using-middleware.html
带有中间件的新路由:
var middlewares = require('./middlewares'),
controllers = require('./controllers');
router.get('/users', middlewares.allUsersFromDynamoDb, controllers.theRouteController);
将数据传递给 req
的中间件 (middlewares.js
),这样您就可以在任何有 req
的地方使用该数据:
exports.allUsersFromDynamoDb = function (req, res, next) {
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));
next("Internal Server Error");
} else {
console.log("DynamoDB Query succeeded.");
req.dataScan = JSON.stringify(data.Items);
next();
}
});
};
最后是 Controller (controllers.js
):
exports.theRouteController = function (req, res) {
// Here is the dataScan you defined in the middleware
res.jsonp(req.dataScan);
};
关于node.js - NodeJS 回调 - 访问 'res',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37235583/