NodeJScallback – 访问“res”
我正在使用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”时定义的callback函数,如果定义为一个单独的函数,可能会非常有用。 我也可以重新使用它来做一些其他的路线。
但是我怎样才能在这个新function里面获得“res”?
我想我应该使用“closures”,但我似乎无法完全正确。 我想我需要保持新的callback函数的签名期望2个参数,“错误”和“数据”按照下面的页面:
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property
任何想法如何做到这一点?
您可以使用该function作为您想要的每个路线的中间件http://expressjs.com/zh/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", 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(); } }); };
最后是控制器( controllers.js
):
exports.theRouteController = function (req, res) { // Here is the dataScan you defined in the middleware res.jsonp(req.dataScan); };
基于Michelem的回答,我尝试了一些让事情变得更清洁的代码,并且代码更加可重用:
var 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) { req.err = err; req.data = data; next(); }); }
现在我声明另一个函数:
var processUserResults = function (req, res, next) { if (req.err) { console.error("Unable to query. Error:", JSON.stringify(req.err)); res.statusCode = 500; res.send("Internal Server Error"); } else { console.log("DynamoDB Query succeeded."); res.end(JSON.stringify(req.data.Items)); } };
最后这个:
router.get('/users', [allUsersFromDynamoDb, processUserResults]);
所有我需要做的原始“function(错误,数据)”callback总是设置2值:
req.err = err req.data = data
并调用next()。 而processUserResults可以类似地用于其他路由。
仍然好奇是否有其他有效的解决scheme。