![](/img/trans.png)
[英]How to return HTML code from Lambda function in NodeJS?
[英]NodeJS Lambda Return result from inside a promise
我有一个 NodeJS lambda function,它使用 mysql 库来选择数据并检索它作为结果。 它通过 API 网关 http 调用触发。
但我似乎无法找到一种方法来返回查询结果作为调用的响应。
这是示例代码:
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const mysql = require('mysql');
const con = mysql.createConnection({
host: process.env.RDS_HOSTNAME,
user: process.env.RDS_USERNAME,
password: process.env.RDS_PASSWORD,
port: process.env.RDS_PORT,
database: process.env.RDS_DATABASE,
});
const tableName = 'fit_guide';
export const handler = async (event, context, callback) => {
let response = {};
const routeKey = event.routeKey;
let sql = `SELECT * FROM ${tableName}`;
con.query(sql, function (error, results, fields) {
if (error) throw error;
// THIS DOES PRINT THE RESULTS FROM THE DATABASE TABLE
console.log('******** ', results);
// THIS DOESN'T RETURN
response = {
statusCode: 200,
success: true,
results,
};
callback(null, JSON.stringify(response));
return response;
});
con.end();
// THIS RETURNS AN EMPTY OBJECT {} (initial value)
callback(null, JSON.stringify(response));
return response;
};
如何返回查询执行中的响应而不是 object 的初始值?
TL; DR你的处理程序有竞争条件。 return response;
行在您的查询和 Lambda callback
有机会执行之前返回{}
。 最简单的解决方法是删除return response;
.
存在竞争条件是因为您的代码混合了 Lambda 非异步(回调,无返回值)和异步(无回调,返回Promise<Something>
)处理程序模式。 正如目前所写,返回值在与回调的竞争中获胜。 您应该使用一种模式或另一种模式,而不是同时使用两种模式。
这是一个像你这样的竞争条件的演示(孩子们不要在家里尝试这个。),正如所写的那样,消息将是Callback wins!
因为回调会在短时间内触发,而 Promise 仅在 1 秒后解析。 添加2秒回调延迟获得Promise return wins!
. 当然,除非您真的很喜欢比赛,否则解决方法是删除一个或另一个。
export const raceHandler = async (
context: Context,
event: APIGatewayProxyEventV2,
callback: APIGatewayProxyCallbackV2
): Promise<APIGatewayProxyResultV2> => {
// Race contestant 1: callback with delay - simulates your MySQL query
setTimeout(() => {
callback(null, {
statusCode: 200,
body: JSON.stringify({ message: "Callback wins!" }),
});
}, 10);
// Race contestant 2: Promise return resolution with delay
return new Promise((resolve) => {
setTimeout(() => {
resolve({
statusCode: 200,
body: JSON.stringify({ message: "Promise return wins!" }),
});
}, 1000);
});
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.