node.js模块答案未定义

时间:2018-09-28 19:17:16

标签: node.js

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

------------- 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));

2 个答案:

答案 0 :(得分:0)

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

由于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);
});

答案 1 :(得分:0)

docClient.get是一个异步函数。您需要使该函数正确化或使用回调。

使用回调:

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/