【发布时间】:2020-05-11 17:53:24
【问题描述】:
我的 Lambda 函数中有一个返回 json 的 http 请求。我正在使用 node.js。我想将该 json 作为对象保存在我的 DynamoDB 表中。
const http = require('https')
const AWS = require('aws-sdk');
AWS.config.update({region: "eu-west-1"});
exports.handler = async (event) => {
return httprequest().then((data) => {
//Parse JSON to objects
// in this case not neccessary because it's already parsed.
// data is already object
// var arr_from_json = JSON.parse(data);
//add Item to DynamoDB
var params = {
TableName: 'json',
Item: {
date: Date.now(),
answer: data.answer,
forced: data.forced,
image: data.image
}
};
var docClient = new AWS.DynamoDB.DocumentClient();
docClient.put(params, function(err, data) {
if (err) console.log(err);
else console.log(data);
});
// Respond with JSON
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
});
};
function httprequest() {
return new Promise((resolve, reject) => {
const options = {
host: 'yesno.wtf',
path: '/api',
port: 443,
method: 'GET'
};
const req = http.request(options, (res) => {
if (res.statusCode < 200 || res.statusCode >= 300) {
return reject(new Error('statusCode=' + res.statusCode));
}
var body = [];
res.on('data', function (chunk) {
body.push(chunk);
});
res.on('end', function () {
try {
body = JSON.parse(Buffer.concat(body).toString());
} catch (e) {
reject(e);
}
resolve(body);
});
});
req.on('error', (e) => {
reject(e.message);
});
// send the request
req.end();
});
}
JSON
{"answer":"no","forced":false,"image":"https://yesno.wtf/assets/no/8-5e08abbe5aacd2cf531948145b787e9a.gif"}
但是,它不会将对象存储在 DynamoDB 中。我能做些什么不同的事情?首先存储在 DynamoDB 中的部分是否正确?
【问题讨论】:
-
您的 lambda 是否具有附加了
AmazonDynamoDBFullAccess策略(或具有写入权限的自定义策略)的角色? -
@Danziger 是的,我有一个具有读写权限的角色。
-
您是否在 CloudWatch 中看到任何警报或错误?也许值得在您的代码中添加一些
console.log()以确保它实际上达到docClient.put()。此外,您可以尝试将其更改为const data = await docClient.put(...).promise()并且仅在 DynamoDB 操作完成后才发回响应,但我猜这应该没有任何区别。 -
@Danziger 感谢您抽出宝贵时间!我只是在
docClient.put(params, function(err, data) {行之前放了一个 console.log(data) ,它显示在 CloudWatch 中。 -
@Danziger 问题可能是我在返回语句
return httprequest().then((data) => {中使用了 put 函数吗?如果是这样,我该如何解决?
标签: javascript amazon-web-services lambda amazon-dynamodb