- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Axios 从 API 获取价格(通常为数千),然后希望将其存储在 DynamoDB 中。如果我在本地调用 lambda 函数,一切都会按预期工作,但如果我部署该函数并使用 AWS CLI 调用它,它不再在 DynamoDB 中存储任何值。我在请求中收到的数据和 Axios 调用的响应是相同的。
我以某种方式认为这是调用 DynamoDB 的异步函数的范围问题,但我无法解决它。期待您的建议。如果您需要更多代码,请告诉我。
updatePrice.js
import { updatePrice } from "./libs/pricing-lib";
import {
success,
failure
} from "./libs/response-lib";
export async function main(event, context) {
try {
let result = await updatePrice(event.pathParameters.id, event.pathParameters.date);
return success(result);
} catch(e) {
return failure(e);
}
}
dynamodb-lib-js
import AWS from "aws-sdk";
export function call(action, params) {
const dynamoDb = new AWS.DynamoDB.DocumentClient();
return dynamoDb[action](params).promise();
}
定价-lib.js
export async function updatePrice(stockid, from) {
try {
let url = getUrl(stockid, from);
const resultEodApi = (await axios.get(url)).data;
resultEodApi.map((price) => {
try {
let priceParams = {
TableName: process.env.pricesTableName,
Item: {
stockid: stockid,
date: price.date,
close: price.close
}
};
dynamoDbLib.call("put", priceParams);
} catch (e) {
return e;
}
});
return true;
} catch (e) {
return e;
}
}
最佳答案
对 Ashish 的答案进行一些扩展。
正如 Ashish 所说,put
操作在 Lambda 部署中不起作用的原因是该调用是异步执行的。
对dynamoDb[action](params).promise()
的调用启动异步put
操作,并返回一个Promise对象。当 put
操作返回时,promise 将被解析。
但是,在您的代码中,您既不等待 promise 得到解决,也不将 promise 作为处理程序的输出返回。对 updatePrice
的调用终止并返回 undefined
,此时 AWS Lambda 暂停函数的执行。因此,put
调用永远不会通过。
您看到远程执行和本地执行之间存在差异的原因是本地 Node.js 进程和 Lambda 函数具有不同的语义。
当您在本地运行 Node.js 进程时,Node.js 进程仅在所有 Promise 都得到解决后才会终止1。
Lambda 执行的行为有所不同。 Lambda 在终止执行之前不会等待 Promise 得到解决2。相反,Lambda 在解决处理程序返回的 Promise 后立即终止执行。在您的情况下,处理函数返回 true
3,因此它会立即解析,并且执行终止。此时,您的 put
调用尚未解决。
为了说明差异,请考虑以下代码:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
module.exports.hello = async (event) => {
sleep(300).then(() => console.log("Finished doing my asynchronous thing, can exit now!"))
console.log("Function execution done!")
return true;
};
// call the handler when running locally:
if (require.main === module) { module.exports.hello(); }
当您在本地运行此函数时,函数执行完成,但 Node 进程仍在运行,直到 promise 得到解决。在本地运行,您将得到以下输出(注意顺序):
> Function execution done!
> Finished doing my asynchronous thing, can exit now!
在 lambda 上运行,当函数执行结束时,其余的运行也会结束。 promise 永远不会兑现。我们将得到以下输出:
START RequestId: <id> Version: $LATEST
2019-12-26T09:04:28.843Z <id> INFO Function execution done!
END RequestId: <id>
REPORT RequestId: <id> Duration: 3.37 ms Billed Duration: 100 ms Memory Size: 1024 MB Max Memory Used: 71 MB Init Duration: 114.44 ms
我们只完成函数执行!
打印。另请注意,执行持续时间仅为 3.37 毫秒。在 AWS 停止进程之前,我们异步运行的 300 毫秒 sleep 没有时间解决。
来自AWS Lambda developer guide :
If your code performs an asynchronous task, return a promise to make sure that it finishes running. When you resolve or reject the promise, Lambda sends the response or error to the invoker.
您可以使用 Ashish 的解决方案——返回您创建的 promise 。或者,您可以显式await
Promise.all
。无论哪种情况,重要的是要确保在从函数返回之前不会丢失任何创建的 promise 。
1 更具体地说,它等待事件循环为空。
2 它实际上暂停了执行。下次调用处理程序时,将从同一位置继续执行。如果您对处理程序进行多次连续调用,则某些 put
可能会通过,具体取决于时间以及 aws-sdk 库处理执行流中此类中断的情况,但这很难预测。
3 实际上,async
函数的返回值始终是包装返回值的 Promise。因此,在您的情况下,您拥有的是 return true;
- true
被包装在 Promise
对象中,该对象会立即解析,并且执行终止。
关于node.js - DynamoDB 记录未通过 map 循环添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59420115/
我正在使用 Boto3 和 Python 开发 Dyanamodb。我发现的问题之一是我们应该何时使用 dynamodb.client、dynamodb.resource 和 dynamodb.Tab
DynamoDB documentation描述了表分区原则上是如何工作的,但它对细节(即数字)非常了解。 DynamoDB 表分区究竟如何以及何时发生? 最佳答案 我找到了这个 presentati
我在 DynamoDB 表中有一个项目。该项目看起来像这样: { data: [ 1, 2, 3, 4, 5, 6 ] more_data: [ 2, 3, 4, 5, 6, 7 ] } 使用
我的 DynamoDB 表中的一个属性是一个名为 REQUEST_IDS 的列表,我想在更新项目之前检查该列表的长度以查看它是否满足条件(小于 10) .如何在 nodejs 的 ConditionE
我正在使用 Amazon Dynamodb,但没有太多经验。我有这样的价格表: 编号 |插入日期 |产品名称 |店名 |价格 相同的商店名称和产品名称可以有不同的值(价格和插入日期可能不同)。例如 i
我对 DynamoDB 上查询/扫描的限制有疑问。 我的表有 1000 条记录,对所有记录的查询返回 50 个值,但是如果我将 Limit 设置为 5,这并不意味着查询将返回前 5 个值,它只是说查询
我需要在 jsp 上显示最大计数为 10 的搜索结果,并且它应该有一个分页来作为分页功能来回遍历。 Dynamodb 有一个 最后评估 key ,但返回上一页无济于事,尽管我可以通过 移动到下一个结果
我是 CouchDB 的忠实粉丝,并且完全爱上了每个文档发出不止一次的 map 函数。我想知道在 DynamoDB 中是否可以通过使用字符串或数字集类型作为散列和范围主键的一部分(作为散列或范围属性)
我目前正在使用 DynamoDB。如果该记录的日期早于新记录日期字段,我想使用条件写入来更新记录。 有没有办法比较条件写入的 DateTime 类型?还是目前仅适用于整数、字符串和流? 谢谢。 最佳答
如何对 dynamoDB 表建模以构建一个标签系统,其中产品可以分配多个标签,并且我们应该能够过滤具有特定标签或标签集合的产品集,并获取分配给给定标签的所有标签产品? 我考虑过有一张 table :
我试图更好地理解在 AWS DynamoDB 中使用邻接列表模式进行多对多 (m:n) 关系设计。 在此处查看 AWS 文档:https://docs.aws.amazon.com/amazondyn
我怀疑 DynamoDB 中的这一说法是否属实或我的理解不正确。它说, ProvisionedThroughputExceededException 消息:您超出了表或一个或多个全局二级索引的最大允许
考虑一个 DynamoDB 表,它由一个主键和两个描述开始日期和结束日期的属性组成。如何在不扫描整个表的情况下查询时间范围是否与表中的时间范围重叠? 例子: 发电机表有两条记录 PK Start
我有一个 DynamoDB 表,其中包含将由许多应用程序读取的键值对。在启动时,每个应用程序将读取整个表并将其缓存在内存中。 我试图解决的问题是,如果 DynamoDB 表中的一个或多个项目已被修改,
我正在有条件地更新 dynamoDB 记录(仅当记录具有其属性之一的特定值时)。无论是否成功更新(条件是否满足),我都想取回记录。 docClient.update(params, function(
我目前正在对 DynamoDB 进行批量加载并将我们的数据项划分为批处理单元: 根据限制文件: https://docs.aws.amazon.com/amazondynamodb/latest/AP
我正在跟踪dynamodb的Python教程,以在端口8000上设置本地dynomodb http://docs.aws.amazon.com/amazondynamodb/latest/gettin
我正在创建一个 DynamoDB 表来保存与单个对象关联的注释。 评论在特定时间发布到对象,我使用发布的时间作为范围,因此评论可以按时间降序排序。我有发布评论的用户的 userId 的全局二级索引,这
我正在运行一个简单的 api,它在每次调用时从 dynamodb 表中获取一个项目,我将自动缩放设置为最小值 25 和最大值 10 000。 但是,如果我使用 wrk 或 hey 之类的工具发送 15
我在模型中有一个字段已声明为字符串,如下所示: App.Student= DS.Model.extend({ name: DS.attr('string'), address1: DS.attr('s
我是一名优秀的程序员,十分优秀!