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。