forEach 不是 运行 在 lambda 函数中
forEach not running inside lambda function
我有一个 Node.js AWS Lamba 函数,它执行数据库调用,然后获取数据库调用的结果并将其拆分为不同的 SQS 消息。目前它似乎被打破了,因为 Lambda 跳过了所有内容,当我添加 await 时(如下所示)它告诉我我不能将 await 用于 sendMessage 部分。
module.exports.companyID = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
if (inter_conn == null) {
inter_conn = await mongoose.createConnection(incident_Mongo_URI, {
bufferCommands: false, // Disable mongoose buffering
bufferMaxEntries: 0, // and MongoDB driver buffering
useNewUrlParser: true // Required or it gives me an error
});
}
const I = inter_conn.model('Incident');
await I.find().distinct('companyID').exec(function(err, results) {
if(err) {
logger.error(`Inter Cleanup: Find: Error message: ${JSON.stringify(err)}`);
process.exit(1);
}
logger.info(results)
results.forEach(companyID => {
let params = {
MessageBody: companyID,
QueueUrl: process.env.incidentsQueue,
DelaySeconds: 0
};
let sendMessage = sqs.sendMessage(params).promise();
await sendMessage.then((data) => {
logger.info(data)
})
.catch((err) => {
logger.error(err)
})
});
})
let output = {
status: 'Done'
}
callback(null, output);
};
从 Lambda 控制台看到的错误消息
{
"errorType": "Runtime.UserCodeSyntaxError",
"errorMessage": "SyntaxError: await is only valid in async function",
"trace": [
"Runtime.UserCodeSyntaxError: SyntaxError: await is only valid in async function",
" at _loadUserApp (/var/runtime/UserFunction.js:98:13)",
" at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
" at Object.<anonymous> (/var/runtime/index.js:45:30)",
" at Module._compile (internal/modules/cjs/loader.js:778:30)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
" at Module.load (internal/modules/cjs/loader.js:653:32)",
" at tryModuleLoad (internal/modules/cjs/loader.js:593:12)",
" at Function.Module._load (internal/modules/cjs/loader.js:585:3)",
" at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)",
" at startup (internal/bootstrap/node.js:283:19)"
]
}
我已经在没有 lambda 相关内容和 JS 文件 运行 中的 async/await 作为脚本的情况下测试了它的基本代码,它运行良好。
我知道问题在于将其转换为 lambda,并且与 Lambda 的存在有关 async/await。
我怎样才能让我的 Lambda 执行数据库调用并运行 forEach,将结果数组中的每个项目放入 SQS 消息中?
您收到的错误是因为您试图 await
在您的 forEach
内部,而不是 async
。但是,不要认为您也可以将其设为 async
函数。
最好的解决办法是停止使用 .forEach
并使用更现代的 for/of
。您的 for 循环看起来像这样:
for (let companyID of results) {
let params = {
MessageBody: companyID,
QueueUrl: process.env.incidentsQueue,
DelaySeconds: 0
};
try {
const data = await sqs.sendMessage(params).promise();
logger.info(data)
}
catch (err) {
logger.error(err);
}
}
注意,我还更改了调用 sendMessage
以使用适当的等待。
我有一个 Node.js AWS Lamba 函数,它执行数据库调用,然后获取数据库调用的结果并将其拆分为不同的 SQS 消息。目前它似乎被打破了,因为 Lambda 跳过了所有内容,当我添加 await 时(如下所示)它告诉我我不能将 await 用于 sendMessage 部分。
module.exports.companyID = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
if (inter_conn == null) {
inter_conn = await mongoose.createConnection(incident_Mongo_URI, {
bufferCommands: false, // Disable mongoose buffering
bufferMaxEntries: 0, // and MongoDB driver buffering
useNewUrlParser: true // Required or it gives me an error
});
}
const I = inter_conn.model('Incident');
await I.find().distinct('companyID').exec(function(err, results) {
if(err) {
logger.error(`Inter Cleanup: Find: Error message: ${JSON.stringify(err)}`);
process.exit(1);
}
logger.info(results)
results.forEach(companyID => {
let params = {
MessageBody: companyID,
QueueUrl: process.env.incidentsQueue,
DelaySeconds: 0
};
let sendMessage = sqs.sendMessage(params).promise();
await sendMessage.then((data) => {
logger.info(data)
})
.catch((err) => {
logger.error(err)
})
});
})
let output = {
status: 'Done'
}
callback(null, output);
};
从 Lambda 控制台看到的错误消息
{
"errorType": "Runtime.UserCodeSyntaxError",
"errorMessage": "SyntaxError: await is only valid in async function",
"trace": [
"Runtime.UserCodeSyntaxError: SyntaxError: await is only valid in async function",
" at _loadUserApp (/var/runtime/UserFunction.js:98:13)",
" at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
" at Object.<anonymous> (/var/runtime/index.js:45:30)",
" at Module._compile (internal/modules/cjs/loader.js:778:30)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
" at Module.load (internal/modules/cjs/loader.js:653:32)",
" at tryModuleLoad (internal/modules/cjs/loader.js:593:12)",
" at Function.Module._load (internal/modules/cjs/loader.js:585:3)",
" at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)",
" at startup (internal/bootstrap/node.js:283:19)"
]
}
我已经在没有 lambda 相关内容和 JS 文件 运行 中的 async/await 作为脚本的情况下测试了它的基本代码,它运行良好。
我知道问题在于将其转换为 lambda,并且与 Lambda 的存在有关 async/await。
我怎样才能让我的 Lambda 执行数据库调用并运行 forEach,将结果数组中的每个项目放入 SQS 消息中?
您收到的错误是因为您试图 await
在您的 forEach
内部,而不是 async
。但是,不要认为您也可以将其设为 async
函数。
最好的解决办法是停止使用 .forEach
并使用更现代的 for/of
。您的 for 循环看起来像这样:
for (let companyID of results) {
let params = {
MessageBody: companyID,
QueueUrl: process.env.incidentsQueue,
DelaySeconds: 0
};
try {
const data = await sqs.sendMessage(params).promise();
logger.info(data)
}
catch (err) {
logger.error(err);
}
}
注意,我还更改了调用 sendMessage
以使用适当的等待。