【问题标题】:Lambda function MySQL result not working on NodeJs 8.10Lambda 函数 MySQL 结果不适用于 NodeJs 8.10
【发布时间】:2019-02-13 21:52:42
【问题描述】:

我在 Node 6.10 中有一个代码,它正在工作... 但如果我将它转换为 Node 8.10,它就不起作用了

var mysql = require("mysql");
var connection = mysql.createConnection({
  host: " localhost",
  user: "root",
  password: "",
  database: "parser_db"
});

exports.handler = async event => {
  connection.connect();

  let response = {
    statusCode: 400,
    body: { Method: "Invalid", event }
  };

  var readTable = "SELECT * FROM documents where id = " + mysql.escape(1);
  connection.query(readTable, function(err, results, fields) {
    if (err) throw err;
    else {
      response = {
        statusCode: 200,
        body: { results }
        //body: { results }
      };
      console.log(response);
      return response;
    }
  });
};

请有人帮我发现问题。如果我在单独的文件中执行 MySQL 查询并返回结果集,它也不起作用。

注意:如果我使用 console.log(response) 打印结果而不是返回它 显示正确的结果。

【问题讨论】:

  • 除了“它不工作”之外,您对问题的了解更多吗?这并没有给任何人太多的继续。
  • 我的意思是它没有返回任何结果......代码执行很好......我在注释中提到过@BobRodes
  • 让我改变它。你把console.log放在哪里?就在return response 线旁边?
  • 请立即检查代码...在控制台中打印响应但不返回任何内容...@BobRodes
  • 问题是您正在从 connection.query() 回调函数中返回响应。这使得 response 成为回调函数的返回值,而不是外部 Lambda 函数的 exports.handler() 的返回值。

标签: mysql node.js amazon-web-services aws-lambda


【解决方案1】:

问题是您从 connection.query() 回调函数中返回响应。这使得 response 成为回调函数的返回值,而不是外部 Lambda 函数的返回值。

重构此代码的一种方法如下:

exports.handler = async (event) => {
  connection.connect();
  return new Promise((resolve, reject) => {
    const readTable = `SELECT * FROM documents where id = ${mysql.escape(1)}`;
    connection.query(readTable, (err, results, fields) => {
      if (err) {
        reject(err);
      } else {
        resolve({statusCode: 200, body: {results}});
      }
    });
  });
};

【讨论】:

    【解决方案2】:

    除了@jarmod的回答,你还可以使用util.promisify方法promisifyconnection.query这样就可以使用await关键字,让代码更简单

    const util = require('util');
    exports.handler = async (event) => {
      connection.connect();
      const readTable = `SELECT * FROM documents where id = ${mysql.escape(1)}`;
      const connQueryPromisified = util.promisify(connection.query).bind(connection);
      const result = await connQueryPromisified(readTable);
      return {statusCode: 200, body: {results}};
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多