javascript - AWS Dynamodb 没有通过节点 js 同步获取数据
问题描述
我是 node js dynamo db 的新手,我写了一个 node js sdk 来从 dynamodb 的表中获取一行。它正在正确获取数据,但不是立即为此我收到错误
我的代码低于一个简单的代码
var AWS = require("aws-sdk");
var config = function(){
AWS.config.update({region: 'us-east-1'});
// Create the DynamoDB service object
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
var params = {
TableName: 'tblConfigs',
// Key: {
// "id" : {S: "1"},
// }
ExpressionAttributeValues: {
":v1": {
S: "1"
}
},
FilterExpression: "id = :v1",
};
var v;
var json = ddb.scan(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
v = data;
// console.log(JSON.stringify(data.Item));
// return JSON.stringify(data.Item);
}
});
// if(v=="u")
// for(var i=0;)
v = v.Items[0];
// for()
var con = {
"host": v.endpoint.S,
"user": v.endpoint.username.S,
"password": v.endpoint.password.S,
"database": v.endpoint.database_name.S
};
return con;
}
我得到了以下错误
> config()
TypeError: Cannot read property 'Items' of undefined
at config (repl:31:7)
因为 v 是未定义的,所以它给出了错误,但是当我在节点控制台中执行代码时 v 不是未定义的,它第一次给出未定义的下一次给出值
像下面
> v
{ Items:
[ { password: [Object],
stage: [Object],
username: [Object],
id: [Object],
endpoint: [Object],
database_name: [Object] } ],
Count: 1,
ScannedCount: 1 }
我怎样才能在一段时间后立即获取该行?dynamodb 有什么好的方法吗?
解决方案
您错过了一件重要的事情:Javascript 执行是异步的。只要您不使用async/await
语法,就必须“玩”这样的回调:
var ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
function loadConfig(callback) {
var params = {
TableName: 'tblConfigs',
ExpressionAttributeValues: {
':v1': {
S: '1'
}
},
FilterExpression: 'id = :v1'
};
ddb.scan(params, function (error, data) {
if (error) {
callback(error);
} else {
var item = data.Items[0];
callback(null, {
'host': item.endpoint.S,
'user': item.endpoint.username.S,
'password': item.endpoint.password.S,
'database': item.endpoint.database_name.S
});
}
});
}
loadConfig(function (error, configuration) {
if (error) {
console.log(error);
} else {
// Your connection logic (JUST AN EXAMPLE!)
var connection = mysql.connect({
host: configuration.host,
user: configuration.user,
password: configuration.password,
database: configuration.database
})
}
});
顺便提一句。在 DynamoDB 中存储数据库配置不是一个好的解决方案,我建议检查AWS Systems Manager Parameter Store
.
编辑
给你一个简短的例子,async/await
语法是怎样的
var ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
const loadConfig = async () => {
const { Items } = await ddb.scan({
TableName: 'tblConfigs',
ExpressionAttributeValues: {
':v1': {
S: '1'
}
},
FilterExpression: 'id = :v1'
}).promise();
const item = Items[0];
return {
'host': item.endpoint.S,
'user': item.endpoint.username.S,
'password': item.endpoint.password.S,
'database': item.endpoint.database_name.S
};
};
推荐阅读
- java - ExpressionVisitor接口的Olingo visitLambdaExpression的实现
- azure-devops - EDITBIN 在 Microsoft 托管代理中的位置
- mysql - Django 按日期分组,SUM 值包括 SUM 零
- wpf - DatePicker 触发器 WPF
- r - 汇总 R 数据框中的列,与顺序无关, (df$A,df$B) = (df$B,df$A)
- asp.net - 加载页面时将正确的 kendo ui 下拉默认值传递给控制器
- sql - MS Access 为表中的每个项目创建一个重复数据的查询
- javascript - 另一个 vuejs 应用程序中的 vuejs 调用方法(单独的窗口)
- swift - 如何将数据从 Swift 4 Data 对象复制到 OutputStream 对象?
- r - 从文本文件导入后正在修剪的 R 字符串