2016-07-24 13 views
0

dynamoDBからのデータのapiエンドポイントを作成しようとしています。私はすべてが接続されていると信じていますが、api(api/db)をチェックするためにpostmanを実行すると、db.js(ルート用)のdb.jsの機能を認識しません。私はapi/testでテストを実行し、情報を取得しています。あなたはそれを使用する場合、次にノードにエクスポートする際に問題が発生しました

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

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; 
+0

'db.scanDBは();'非同期ですが、あなたはそれを行うの際に、発信者が知るためにどのような方法を提供していません。 – jfriend00

答えて

1
が適切に非同期の結果を返すために、あなたの db.scan()機能を変更

:ここでは両方のファイルからのコードがある

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

それは本当にありません非同期操作がいつ行われたのかを呼び出し元が知る方法がなかったため、DBオブジェクトにscanDBの結果を格納することはできませんでした。したがって、非同期操作が(コールバックまたは約束を介して)実行されたときに、呼び出し側に対して何らかの通知を行う必要があるので、結果だけを渡すこともできます。

また、あなたのrouter.get(...)ハンドラ内.then()ハンドラが属していません。私はあなたが示すコードに約束がないので、それがなぜそこにあるのか分かりません。問題を作成するときにカット/ペーストエラーが発生した可能性はありますか?もう少し複雑なコード以外のことに何のメリットがなかったので、

注、私はあなたのgetDatabase()定義から生命維持を削除しました。

+0

私はこの実装を試してみましたが、私は郵便配達を行うときのテストは、私が戻って受信し続けます - db.scanDBが機能 – JamesHandshoe

+0

@JamesHandshoeではありません - 私は私の答えにいくつかの他の部品を追加しました。 'db.scanDB'が関数でない場合、' module.exports'か 'require()'を正しく実行していません。私があなたをさらに助けるためには、あなたのコードがどのように見えるかを正確に見せなければなりません。私の答えでそれを示したように、それは動作します。 – jfriend00

関連する問題