![](/img/trans.png)
[英]AWS Lambda Node.js execute this.emit after async HTTP request completes
[英]Problems incorporating an async http request function after a DynamoDb put in node.js lambda
我有一个用 node.js 编写的 AWS Lambda function 将产品发布到 DynamoDB 表。 除了调用 db.put,我还需要使用 Slack SDK 发出额外的 http 请求。 这是我提取的一个示例,我想在 DynamoDB 调用成功后运行它。 我在将它与我当前的代码合并时遇到问题,因为示例是异步 function 并且我当前的代码没有使用异步/等待模式。
我试图调用的代码写在异步语句中:
(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
console.log('Message sent: ', res.ts);
})();
下面是我当前的 function createProduct 将产品发布到 DynamoDB(我想在数据库调用成功后立即调用上述代码):
'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
function response(statusCode, message) {
return {
statusCode: statusCode,
body: JSON.stringify(message)
};
}
// Create a product
module.exports.createProduct = (event, context, callback) => {
const reqBody = JSON.parse(event.body);
const product = {
id: uuid(),
createdAt: new Date().toISOString(),
userId: 1,
name: reqBody.name,
price: reqBody.price
};
return db
.put({
TableName: productsTable,
Item: product
})
.promise()
.then(() => {
callback(null, response(201, product));
})
.catch((err) => response(null, response(err.statusCode, err)));
};
您可以使用 Promise,而不是使用 async/await,这需要您将节点运行时升级到 10.x。 由于您想在 DDB 调用成功后运行它,您可以执行以下操作:
'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
function response(statusCode, message) {
return {
statusCode: statusCode,
body: JSON.stringify(message)
};
}
// Create a product
module.exports.createProduct = (event, context, callback) => {
const reqBody = JSON.parse(event.body);
const product = {
id: uuid(),
createdAt: new Date().toISOString(),
userId: 1,
name: reqBody.name,
price: reqBody.price
};
return db
.put({
TableName: productsTable,
Item: product
})
.promise()
.then(() => {
return web.chat.postMessage({ channel: conversationId, text: 'Hello there' });
})
.then(() => {
callback(null, response(201, product));
})
.catch((err) => response(null, response(err.statusCode, err)));
};
我认为您可以在没有等待的情况下在回调之前调用它,并使用 Promise.all
callback(null, response(201, product));
无需等待,只需执行
const res = web.chat.postMessage({ channel: conversationId, text: 'Hello there' });
Promise.all(res)
.then(response => {
console.log(response[0])
callback(null, response(201, product));
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.