mysql - 从 NodeJS AWS Lambda 函数查询 MySQL 数据库

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

我在 AWS Lambda 函数中查询我的 MySQL 数据库(从 AWS 远程托管)时遇到问题。

这是我的代码,除了 Lambda 函数的其余部分所需的部分(为 Alexa 技能调用):

  var mysql = require('mysql');
  var connection = mysql.createConnection({
        host     : '<myserver>',
        user     : '<myusername>',
        password : '<mypw>',
        database : '<mydatabase>'
  });
  connection.connect(function(err){
        if(!err) {
              console.log("Database is connected ... nn");
        }
        else {
              console.log("Error connecting database ... nn");
        }
  });

  connection.query("INSERT INTO Users (user_id) VALUES ('TESTNAME')");
  connection.end();

当我在命令提示符下使用 node 运行它时,它工作得很好:

node index.js

我正在使用通过 npm 安装在目录中的“mysql”模块和 index.js 并将其压缩并上传到我的 Lambda 函数。

同样,这在我的开发机器上有效,但在测试我的 Lambda 函数时没有给出任何指示,说明为什么它根本不影响我的数据库。

我的问题扩展到 Alexa 和 Lambda,因为它涉及 mysql Node.JS 模块的正确使用。

这是我当前的 Lambda 代码,当然,这里的问题仍然是我的测试值 -> 名为“TESTNAME”的用户名没有添加到我的 MySQL 数据库中。

我按照第一条评论的建议将查询放入连接回调中,并且我将我的新代码而不是更新上面的旧代码只是为了记录我认为代码应该如何过渡到我的Alexa 的 Lambda 函数:

更新代码:

var mysql = require('mysql');
var connection = mysql.createConnection({
      host     : '<myserver>',
      user     : '<myusername>',
      password : '<mypw>',
      database : '<mydatabase>'
});
exports.handler = (event, context) => {
    try {

        if (event.session.new) {
            // New Session
            console.log("NEW SESSION");
        }


        switch (event.request.type) {

            case "LaunchRequest":
                // Launch Request
                console.log(`LAUNCH REQUEST`);
                context.succeed(
                    generateResponse({},
                        buildSpeechletResponse("Welcome to an Alexa Skill, this is running on a deployed lamda function", true)
                    )
                );
                break;

            case "IntentRequest":
                // Intent Request
                console.log(`Intent Request`);
                console.log('Then run MySQL code:');
                connection.connect(function(err) {
                    console.log('Inside connection.connect() callback');
                    if (!err) {
                        console.log("Database is connected ... ");
                        connection.query("INSERT INTO Users (user_id) VALUES ('TESTNAME')",
                            function(err, result) {
                                console.log("Inside connection.query() callback")
                                if (!err) {
                                    console.log("Query Successful! Ending Connectection.");
                                    connection.end();
                                } else {
                                    console.log("Query error!");
                                }
                            });
                    } else {
                        console.log("Error connecting database ..." + err.message);
                    }
                });
                context.succeed(
                    generateResponse({},
                        buildSpeechletResponse("Welcome to the incredible intelligent MySQLable Alexa!", true)
                    )
                );

                break;

            case "SessionEndedRequest":
                // Session Ended Request
                console.log(`SESSION ENDED REQUEST`);
                break;

            default:
                context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);

        }

    } catch (error) {
        context.fail(`Exceptiodn: ${error}`)
    }

};

//Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {

    return {
        outputSpeech: {
            type: "PlainText",
            text: outputText
        },
        shouldEndSession: shouldEndSession
    };
};

generateResponse = (sessionAttributes, speechletResponse) => {
    return {
        version: "1.0",
        sessionAttributes: sessionAttributes,
        response: speechletResponse
    };
};

我的控制台输出:

START RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1 Version: $LATEST
2017-03-06T13:39:47.561Z    5d4d17a7-0272-11e7-951c-b3d6944457e1    Intent Request
2017-03-06T13:39:47.562Z    5d4d17a7-0272-11e7-951c-b3d6944457e1    Then run MySQL code:
END RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1
REPORT RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1  Duration: 82.48 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 14 MB  

最佳答案

问题是我需要将 context.succeed 放入回调中。非常感谢 sqlbot,因为他关于回调的讨论让我研究了事情实际结束执行的位置。

显然,在使用 AWS Lambda 时,如果“上下文”在您的回调被调用之前结束,您就不会收到回调。因此,即使我像这样放置了所有回调:connect -> query -> end,来自 connect 的链的第一个回调永远不会被调用,因为“context.succeed”随后被调用,结束了执行。

这是我目前的代码(现在进行正确的查询):

var mysql = require('mysql');
var connection = mysql.createConnection({
    ...
});

exports.handler = (event, context) => {
    try {

        if (event.session.new) {
            // New Session
            console.log("NEW SESSION");
        }


        switch (event.request.type) {

            case "LaunchRequest":
                // Launch Request
                console.log(`LAUNCH REQUEST`);
                context.succeed(
                    generateResponse({},
                        buildSpeechletResponse("Welcome to an Alexa Skill, this is running on a deployed lamda function", true)
                    )
                );
                break;

            case "IntentRequest":
                // Intent Request
                console.log(`Intent Request`);
                console.log('Then run MySQL code:');
                connection.connect(function(err) {
                    console.log('Inside connection.connect() callback');
                    if (!err) {
                        console.log("Database is connected ... ");
                        connection.query("INSERT INTO Users (user_id) VALUES ('TESTNAME')",
                            function(err, result) {
                                console.log("Inside connection.query() callback")
                                if (!err) {
                                    console.log("Query Successful! Ending Connection.");
                                    connection.end();
                                } else {
                                    console.log("Query error!");
                                }
                            });
                    } else {
                        console.log("Error connecting database ..." + err.message);
                    }
                    context.succeed(
                        generateResponse({},
                            buildSpeechletResponse("Welcome to the incredible intelligent MySQLable Alexa!", true)
                        )
                    );
                });

                break;

            case "SessionEndedRequest":
                // Session Ended Request
                console.log(`SESSION ENDED REQUEST`);
                break;

            default:
                context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);

        }

    } catch (error) {
        context.fail(`Exceptiodn: ${error}`)
    }

};

//Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {

    return {
        outputSpeech: {
            type: "PlainText",
            text: outputText
        },
        shouldEndSession: shouldEndSession
    };
};

generateResponse = (sessionAttributes, speechletResponse) => {
    return {
        version: "1.0",
        sessionAttributes: sessionAttributes,
        response: speechletResponse
    };
};

关于mysql - 从 NodeJS AWS Lambda 函数查询 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42591610/

相关文章:

iPhone数据传输问题

java - Android MySQL + PHP + JSON

node.js - Mongoose pre.save() 异步中间件未按预期工作

linux - 在 Elastic Beanstalk 上为 FFMPEG 启用 libmp3lame

PHP mySQL - 选择未从不同表中使用的唯一值

mysql - 从另一个表 AS 值中选择数据时,操作数应包含 1 列

node.js - AWS Elastic Beanstalk - 找不到模块 "hapi"

node.js - 如何回滚一天?

amazon-web-services - 为什么 base64 是 sha1/sha256 哈希?

amazon-web-services - AWS 为 ECS Auto Scaling 组中启动的实例创建标签