2016-03-23 6 views
1

Ich erstelle eine Wetterstation mit Particle Electron und AWS. Ich habe es geschaffen, die zurückgegebenen Daten auf ein DynamoDB Tabelle „Wetter“ geschickt zu bekommen, die alle Wetterdaten mit dem folgende Schema enthält (mit beiliegenden Beispielwerten):Holen Artikel aus dynamodb Tabelle mit separaten Indextabelle mit Node.js

Item{13} 
deviceId: 540056000a51343334363138 (String) (Primary Partition Key) 
tm: 1458754711 (Number) (Primary Sort Key) 
batSoC: 89 (String) 
batV: 4.01 (String) 
hum: 27.9 (String) 
lat: 41.2083 (String) 
lon: -73.3439 (String) 
pres: 968.4 (String) 
temp: 19.8 (String) 
uvI: 0.1 (String) 
wDir: 0 (String) 
wGst: 0.0 (String) 
wSpd: 0.0 (String) 

sowie einen separaten „weather_index“ Tisch enthält nur die Attribute deviceId und tm für die neuesten Daten, die in die Haupttabelle geschrieben wurden (eine Art wie ein Atomzähler, aber für einen periodisch aktualisierten Unix-Zeitstempelwert). Wenn also der „weather_index“ Artikel oben ist der letzten Eintrag, den Eintrag in der „weather_index“ Tabelle würde wie folgt aussehen:

Item{2} 
deviceIdString: 540056000a51343334363138 (String) (Primary Partition Key) 
tmNumber: 1458754711 (Number) 

Ich bin derzeit versucht, einen sehr grundlegenden Web-Frontend in Node.js zu schreiben (die, die vor diesem Projekt habe ich keine Erfahrung mit, hatte so lerne ich immer noch) und kann nicht herausfinden, wie man:

  1. eine DynamoDB getItem Perform, die einen Parameter über eine vorherige getItem abgerufen enthält. Wie:

latestTime = getItem (weather_index, deviceId) // Ruft die Zeit "tm" der jüngsten Wetterbeobachtung und speichert sie in "latestTime" // Wo "weather_index" ist der Name der Tabelle

DasaktuelleWetter = getItem (deviceId, tm) // Ruft die Wetterbeobachtung für den angegebenen „tm“ Wert und speichert sie in „DasaktuelleWetter“ // Wo „tm“ ist das Unix-Zeitstempel der jüngsten Beobachtung

Ich möchte dann die einzelnen Werte auf dem Terminal/Webseite/Brieftaube/etc ... drucken können (Etwas in der Art von currentWeather.deviceId, currentWeather.tm, currentWeather.batSoC, etc ...

Ich habe den folgenden Code ein, dass ich die Arbeit nicht wirklich richtig machen kann:

/* 
* Module dependencies 
*/ 
var AWS = require('aws-sdk') 

// weathermon_dev credentials 
AWS.config.update({accessKeyId: 'REDACTED for obvious reasons', secretAccessKey: 'This bit too'}); 

// Select AWS region 
AWS.config.update({region: 'us-east-1'}); 

var db = new AWS.DynamoDB(); 
// db.listTables(function(err,data) { 
// console.log(data.TableNames); 
// }); 


var time = Date.now()/1000; 
time = Math.round(time); 
//console.log("Time: "); 
//console.log(time); 

time = Math.round(time); 



var deviceId = "540056000a51343334363138" 

var params = { 
    Key: { 
    deviceId: {S: deviceId} 
    }, 
    TableName: 'weather_index' 
}; 

var timeJson; 

db.getItem(params, function(err,data) { 
    if (err) console.log(err); // an error occurred 
    else console.log(data); // successful response 
    var timeJson = JSON.parse(data); 
}) 

// var timeJson = JSON.parse(data); 
// var itemTime = timeJson.item; 

console.log("timeJSON: " + timeJson); 

// console.log("itemTime: " + itemTime); 



var params = { 
    Key: { 
    deviceId: {S: deviceId}, 
    time: {N: 'tm'} 
    }, 
    TableName: 'weather' 
}; 


db.getItem(params, function(err, data) { 
    if (err) console.log(err); // an error occurred 
    else console.log(data); // successful response 
}) 

Jede Hilfe wäre sehr dankbar.

Antwort

0

Sie müssen prüfen, wie NodeJS asynchrone Aufrufe funktionieren. Sie müssen warten, bis der Rückruf von der ersten getItem() aufgerufen wird, bevor Sie die zweite getItem() ausführen.

Ich habe den relevanten Teil Ihres Codes hier umgeschrieben, um Ihnen zu zeigen, worüber ich spreche, aber ich empfehle Ihnen zu verstehen, warum der Code auf diese Weise geschrieben werden muss, anstatt ihn einfach zu kopieren/einzufügen .

var deviceId = "540056000a51343334363138" 

var params = { 
    Key: { 
    deviceId: {S: deviceId} 
    }, 
    TableName: 'weather_index' 
}; 

var timeJson; 

db.getItem(params, function(err,data) { 
    if (err) console.log(err); // an error occurred 
    else { 
    console.log(data); // successful response 
    var timeJson = JSON.parse(data); 
    console.log("timeJSON: " + timeJson); 

    // Inside this callback we have the weather_index tm value, 
    // so query the weather table here. 
    var params = { 
     Key: { 
     deviceId: {S: deviceId}, 
     time: {N: 'tm'} 
     }, 
     TableName: 'weather' 
    }; 

    db.getItem(params, function(err, data) { 
     if (err) console.log(err); // an error occurred 
     else { 
     console.log(data); // successful response 
     // TODO: Use the database response data here 
     } 
    }); 
    } 
}); 
Verwandte Themen