Problems incorporating an async http request function after a DynamoDb put in node.js lambda
我有一个用 node.js 编写的 AWS Lambda 函数,它将产品发布到 DynamoDB 表中。除了调用 db.put 之外,我还需要使用 Slack SDK 发出一个额外的 http 请求。这是我提取的一个示例,我想在 DynamoDB 调用成功后运行它。我在将它与我当前的代码合并时遇到问题,因为该示例是一个异步函数,而我当前的代码没有使用异步/等待模式。
我试图调用的代码写在异步语句中:
1
2 3 4 5 6 7 |
(async () => {
// See: https://api.slack.com/methods/chat.postMessage const res = await web.chat.postMessage({ channel: conversationId, text: ‘Hello there’ }); // `res` contains information about the posted message |
下面是我当前的函数 createProduct,它将产品发布到 DynamoDB(我想在数据库调用成功后立即调用上述代码):
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
‘use strict’;
const AWS = require(‘aws-sdk’); const db = new AWS.DynamoDB.DocumentClient({ apiVersion: ‘2012-08-10’ }); const uuid = require(‘uuid/v4’); const { WebClient } = require(‘@slack/web-api’); const productsTable = process.env.PRODUCTS_TABLE; const token = process.env.SLACK_TOKEN; const web = new WebClient(token); const conversationId = ‘C1232456’;
// Create a response // Create a product const product = { return db |
您可以使用 Promise,而不是使用 async/await,这需要您将节点运行时升级到 10.x。由于您想在 DDB 调用成功后运行它,您可以执行以下操作:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
‘use strict’;
const AWS = require(‘aws-sdk’); const db = new AWS.DynamoDB.DocumentClient({ apiVersion: ‘2012-08-10’ }); const uuid = require(‘uuid/v4’); const { WebClient } = require(‘@slack/web-api’); const productsTable = process.env.PRODUCTS_TABLE; const token = process.env.SLACK_TOKEN; const web = new WebClient(token); const conversationId = ‘C1232456’;
// Create a response // Create a product const product = { return db |
- 谢谢!如果我先发送 Slack 消息,得到响应,然后进行数据库调用怎么办?
- 我相信我会翻转订单对吗?进行 web.chat 调用并在 .then() 中使用从 web.chat 调用返回的值进行 db 调用。
- @BlakeRivell 完全正确…链接Promise,您只需颠倒顺序
- 我真的需要对此做更多的研究,只是想快速完成一些事情。最后一个问题,如果你不介意的话。为什么有时我会看到 .promise() 而其他时候我们只是直接转到 .then。 .promise() 的意义何在?
- aws-sdk 用 .promise() package了他们的所有服务……这是因为他们过去有回调并且不想弃用功能,所以他们添加了 Promise 功能。
- 我明白了,它基本上创建了一个 promise() 然后你调用它?什么情况下不需要调用 .promise()?
- 仅当服务具有它导出的 promise() 函数时。大多数时候,服务会直接返回一个Promise,因此你不需要调用 .promise()。这种模式在 aws-sdk 中很典型,但老实说,我还没有真正体验过它与任何其他依赖项
- @LostJohn 最后一件事。你有什么资源可以让我了解所有关于 js 和 node 的异步。我购买了这个:udemy.com/course/the-complete-nodejs-developer-course-2,但也想知道是否还有其他我应该研究的东西。也许我需要从香草 js 开始。 (到目前为止,我一直使用 jQuery AJAX 请求,所以所有这些新语法都让我感到厌烦)。
- 所以,在资源方面,它基本上是对 JS 演变的理解。所以,我们开始使用回调;我认为在这个地狱中生活一段时间是件好事,这样你才能体会到变化。回调之后出现了 promise,这很棒,我仍然一直在使用,但人们仍然厌倦了类似回调的性质。现在 Async 基本上是将所有函数返回package在一个 Promise 中,并提取结果。我不知道学习它的好地方,除非尝试所有三种解决方案。
- 让我们在聊天中继续这个讨论。
我认为您可以在没有等待的情况下在回调之前调用它,并使用 Promise.all
1
|
callback(null, response(201, product));
|
不用等待,直接做
1
2 3 4 5 6 |
const res = web.chat.postMessage({ channel: conversationId, text: ‘Hello there’ });
Promise.all(res) .then(response => { console.log(response[0]) callback(null, response(201, product)); }); |
- Promise.all 接受一系列Promise,您在上面的所有内容都将被解决
来源:https://www.codenong.com/58200967/