Node.js 8.10中具有异步瀑布的AWS Lambda查询

时间:2019-04-11 08:00:23

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

我依次发送两个查询 查询A表中的数据,然后根据结果查询B表中的数据。

所以,我这样查询数据

var async = require('async');
var mysql = require('mysql');
var config = require('./config.json');
var connection = mysql.createConnection({
  host     : config.dbhost,
  user     : config.dbuser,
  password : config.dbpassword,
  database : config.dbname
});

exports.handler = (event, context, callback) => {
    // TODO implement
    var tasks = [
        function (callback) {
            connection.query("SELECT email FROM Visitor WHERE id =?;", [1], function (err, row) {
                if (err) return callback(err);
                if (row.length == 0) return callback('No Result Error');
                callback(null, row[0]);
            })
        },
        function (data, callback) {
            connection.query("SELECT id,signtime FROM Board WHERE email =?;", data.email, function (err, row) {
                if (err) return callback(err);
                if (row.length == 0) {
                  return callback('No Result Error');
                }else {
                  callback(null, row[0])
                }
            })
        }
    ];

    async.waterfall(tasks, function (err, result) {
        if (err)
          console.log('err');
        else
          ***return result;***
          console.log('done');
        connection.end();
    });
};

我使用console.log()记录数据,它在命令行中获取数据。 但是在lambda中,将函数放入exports.handler中,它的响应为空。 如果将“返回结果”更改为callback(result),则会发生错误。 我认为解决这个问题可能太简单了 如果您知道这一点,请帮助我

1 个答案:

答案 0 :(得分:1)

在第一种情况下,response为空,因为您既没有使用Promise,也没有使用回调来让Lambda沙盒知道该工作已完成。在第二种情况下,您使用了回调,但是将结果作为第一个参数传递给了它。 Node.js的Lambda编程模型遵循称为“错误优先回调”的原则。长话短说,如果执行期间发生任何错误,则应使用callback(error),如果一切正常,并且需要从lambda返回一些结果,则应使用callback(null, result)。因此,基本上在您console.log('done');使用callback(null, result)之前,您就可以使用它了,