我正在使用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上调用“scan”时定义的回调可能非常有用.我也可以为我的其他一些路线重复使用它.
但是我怎样仍然可以访问这个新功能中的“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);
中间件(middlewares.js),您将数据传递给req,以便您可以在所有需要的地方使用该数据:
exports.allUsersFromDynamoDb = function (req,res,next) { var dynamodbDoc = new AWS.DynamoDB.DocumentClient(); var params = { TableName: "users",age" }; dynamodbDoc.scan(params,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(); } }); };
最后控制器(controllers.js):
exports.theRouteController = function (req,res) { // Here is the dataScan you defined in the middleware res.jsonp(req.dataScan); };