我在节点导出时遇到问题

时间:2016-07-24 19:01:35

标签: node.js

我正在尝试为来自dynamoDB的数据创建api端点。我相信我已经连接了一切,但是当我运行邮递员来检查api(api / db)时,它无法识别db.js中的db.js中的函数(用于路由)。我已经对api / test进行了测试,并且正在获取信息。以下是两个文件的代码:

1.  This scans the database and I'm trying to export it to another file.

var AWS = require('aws-sdk');

var params = {
    TableName : "iotbuttonsn",
    //KeyConditionExpression: "serialNumber =:serialNumber",

    //ExpressionAttributeValues: {
    //    ":serialNumber":"*"
//},

ScanIndexForward: false,
Limit: 3,
Select: 'ALL_ATTRIBUTES'
};

AWS.config.update({
  region: "us-east-1",
  endpoint: "https://dynamodb.us-east-1.amazonaws.com"
});

var docClient = new AWS.DynamoDB.DocumentClient();

var getDatabase = (function(){

    return {

    scanDB: function(){
        docClient.scan(params, onScan);
        var onScan = function(err, data){
            if (err) {
                console.log(err.message);
            } else {
                console.log('scan success');
                len = data.Items.length;
                for (n=0; n<len; n++) {
                    clickTypes[n] = data.Items[n].payload.clickType;
                    serialNums[n] = data.Items[n].serialNumber;
                }
            }
        };
    },
    clickTypes: [],
    serialNums: []
  };    
})();

module.exports = getDatabase;

2.  This is where I'm trying to input but db.scanDB() isn't working:

var router = require('express').Router();
var db = require('../routes/db.js');

router.get('/', function(req, res){
    db.scanDB();
    buttons = 
    [
        iot_buttonOne = {
            serialNum: db.serialNum[0],
            clickType: db.clickTypes[0]
    },
        iot_buttonTwo = {
            serialNum: db.serialNum[1],
            clickType: db.clickTypes[1]
        }

        ]
    .then(
        function scanSuccess(data){
            res.json(data);
        },

        function scanError(err){
            res.send(500, err.message);
        }

    );

});

module.exports = router;

1 个答案:

答案 0 :(得分:1)

更改db.scan()功能以正确返回异步结果:

// db.js
module.exports = {
    scanDB: function(cb){

        docClient.scan(params, function(err, data) {
            var clickTypes = [], serialNums = [];
            if (err) {
                console.log(err.message);
                cb(err);
            } else {
                console.log('scan success');
                len = data.Items.length;
                for (n=0; n<len; n++) {
                    clickTypes[n] = data.Items[n].payload.clickType;
                    serialNums[n] = data.Items[n].serialNumber;
                }
                cb(null, {clickTypes, serialNums});
            }
        });
    }
};    

然后,当你使用它时:

var db = require('../routes/db.js');
db.scanDB(function(err, data) {
    if (!err) {
        // data.clickTypes
        // data.serialNums
    } else {
        // process error
    }
});

将scanDB结果放在数据库对象上的方式并不好,因为调用程序无法知道异步操作何时完成。因此,由于您必须在异步操作完成时(通过回调或承诺)为调用者提供一些通知,您也可以在那里传递结果。

此外,.then()处理程序中的router.get(...)处理程序不属于此处。我不知道它为什么会存在,因为你展示的代码中没有任何承诺。创建问题时可能出现剪切/粘贴错误?

注意,我从getDatabase()定义中删除了IIFE,因为除了更复杂的代码之外没有任何好处。