【问题标题】:node.js module answer undefined [duplicate]node.js模块回答未定义[重复]
【发布时间】:2019-03-04 19:30:03
【问题描述】:

有人可以帮帮我吗?我试图弄清楚,但我没有想法。

-------------dynamo.js....

module.exports.readUser = function (user_id) {
    AWS.config = new AWS.Config();
    AWS.config.update({region:  "eu-west-1"});

    var docClient = new AWS.DynamoDB.DocumentClient();
    var table = "user";
    var user_id = user_id;
    var params = {
        TableName: table,
        Key:{
            "user_id": user_id
        }
    };
    docClient.get(params, function(err, data) {
        if (err) {
            return err;
        } else {
            //console.log(data); <-- data is filled 
            return data;
        }
    });

var dynamo = require("./dynamo.js");
console.log(dynamo.readUser(4711998));

【问题讨论】:

  • 你能更详细地解释这个问题吗?如果可能,包括控制台输出。
  • 没有那么多 ubuntu@ip-172-31-21-157:~$ node test.js ec2 undefined
  • 数据填充了一个json但是console.log(dynamo.readUser(4711998));只给出一个未定义的

标签: node.js


【解决方案1】:

您在函数内注销的数据只是作为第二个参数提供给docClient.get 的匿名函数的返回值。导出的readUser 函数没有返回语句,因此它是未定义的。

由于 javascript 的异步特性,您必须通过回调访问结果,如下所示:

module.exports.readUser = function (user_id, cb) {
    ...
    docClient.get(params, function(err, data) {
        if (err) {
            return err;
        } else {
            return cb(data);
        }
    });
}

var dynamo = require("./dynamo.js");
dynamo.readUser(4711998, function (user) {
    console.log(user);
});

【讨论】:

    【解决方案2】:

    docClient.get 是一个异步函数。你需要promisify这个函数或者使用回调。

    使用回调:

    module.exports.readUser = function (user_id, cb) {
        AWS.config = new AWS.Config();
        AWS.config.update({ region: "eu-west-1" });
    
        var docClient = new AWS.DynamoDB.DocumentClient();
        var table = "user";
        var user_id = user_id;
        var params = {
            TableName: table,
            Key: {
                "user_id": user_id
            }
        };
        docClient.get(params, cb);
    }
    

    var dynamo = require("./dynamo.js");
    
    dynamo.readUser(4711998, function (err, user) {
        if(err)
            console.error(err);
        else
            console.log(user);
    });
    

    使用承诺:

    module.exports.readUser = function (user_id) {
        AWS.config = new AWS.Config();
        AWS.config.update({ region: "eu-west-1" });
    
        var docClient = new AWS.DynamoDB.DocumentClient();
        var table = "user";
        var user_id = user_id;
        var params = {
            TableName: table,
            Key: {
                "user_id": user_id
            }
        };
        return new Promise(function(resolve, reject) {
            docClient.get(params, function(err, data) {
                if (err) {
                    reject(err);
                } else {
                    resolve(data);
                }
            });
        });
    }
    

    var dynamo = require("./dynamo.js");
    
    dynamo.readUser(4711998).then(function (user) {
        console.log(user);
    }).catch(function(err) {
        console.error(err);
    });
    

    阅读更多:

    How do I promisify the AWS JavaScript SDK?

    https://aws.amazon.com/ru/blogs/developer/support-for-promises-in-the-sdk/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多