node.js - NodeJS 回调 - 访问 'res'

标签 node.js callback closures

我正在使用 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/

相关文章:

node.js - Node.js 中异步函数的问题

python - cv2.createTrackbar 将 userdata 参数传递给回调

Javascript 调用一个函数,并且在它返回之前不会再次调用它

node.js - React Js 中的重定向

sql-server - SQL Server 连接到 Node js

node.js - 当其中一个 fork 陷入阻塞操作时,其他集群 fork 无法获取请求

python - 类 lambda 回调 NameError

c++ - 在 C 和 C++ 中使用以前未知的参数回调函数

f# - F# 函数中的类 C++ 静态变量

java - 在 Java 中引用匿名内部类中封闭类的非最终字段