代码之家  ›  专栏  ›  技术社区  ›  Md. Helal Uddin

Lambda函数MySQL result在NodeJs 8.10上不起作用

  •  1
  • Md. Helal Uddin  · 技术社区  · 6 年前

    我有一个节点6.10的代码,它正在工作。。。 但如果我把它转换成节点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;
        }
      });
    };
    

    注意:如果我用控制台.log(回应)而不是返回 显示正确的结果。

    2 回复  |  直到 6 年前
        1
  •  1
  •   jarmod    6 年前

    问题是您正在从内部返回响应连接.查询()回调函数。这使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
  •  1
  •   Ayush Gupta    6 年前

    除了@jarmod的答案,您还可以使用 util.promisify connection.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}};
    };