2016-03-23 18 views
1

Particle Electron ve AWS kullanarak bir hava durumu istasyonu oluşturuyorum.Node.js ile ayrı dizin tablosunu kullanarak dynamodb tablosundan öğe alın

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) 

yanı sıra ayrı bir "weather_index" tablosunu: Ben (paket içeriğine dahil numune değerlerle) aşağıdaki şema ile meteorolojik verilerin içeren bir DynamoDB tablosu "hava" gönderilen iade veri almak başarmış Yalnızca ana tabloya yazılan en son verilere ait deviceId ve tm özniteliklerini içerir (atomik sayıcı gibi ama periyodik olarak güncelleştirilen unix zaman damgası değeri için). Yani "weather_index" öğesi üzerinde şu şekilde görünecektir "weather_index" tablosunda en son girdiyi, öğe ise: Şu anda node.js çok temel web ön uç (yazmaya çalışıyorum

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

hangi öncesinde bu projeye, ben hiçbir deneyimim oldu, bu yüzden hala öğreniyorum) ve nasıl bilemiyorum:

  1. bir önceki GetItem yoluyla alınan bir parametre içeren bir DynamoDB getItem gerçekleştirin. Gibi:

latestTime = getItem (weather_index, deviceId) // o "latestTime" En son hava gözlem ve mağazaların zaman "tm" alır // "weather_index" tablo adı

olduğunda

currentWeather = getItem (deviceId tm) // o "currentWeather" belirtilen "tm" değeri ve mağazalarda "tm" en son gözlem unix zaman damgası olan // hava gözlemi alır

Daha sonra bireysel değerleri terminal/web sayfası/taşıyıcı güvercini/etc'ye yazdırabilirim ... (currentWeather.deviceId, currentWeather.tm, currentWeather.batSoC, vb ...

Ben gerçekten düzgün çalışması yapamaz aşağıdaki kod var:

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

Herhangi bir yardım büyük takdir.

cevap

0

NodeJS eşzamansız çağrıların nasıl çalıştığını incelemeniz gerekir. İkinci getItem()'u gerçekleştirmeden önce, ilk getItem() numaralı çağrıdan geri çağrılana kadar beklemeniz gerekir.

Kodun ilgili kısmını burada yazdıklarını size göstermek için buraya yazdım, ancak kodun sadece kopyalamak/yapıştırmak yerine neden bu şekilde yazılması gerektiğini anlamanızı öneririz. .

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