繁体   English   中英

NodeJS Lambda 从 promise 内部返回结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM