Alexa调用了Lambda函数来查询MySQL数据库循环

Alexa调用了Lambda函数来查询MySQL数据库循环,mysql,node.js,amazon-web-services,aws-lambda,alexa,Mysql,Node.js,Amazon Web Services,Aws Lambda,Alexa,当我尝试运行下面的lambda函数时,我得到了添加到MySQL数据库中的适当值,但是,Alexa skill输出了一个错误,并且尝试从数据库中删除该值表明它会立即再次添加,直到我更改表名为止(然后我猜它会出错并最终停止) 当我从我的技能中调用任何Alexa意图时,我会触发MySQL位。我不太了解回调和Alexa上下文,所以我想我在处理它们时做了一些不正确的事情。似乎查询命令被调用了很多次,我不明白这一点,因为在每次回调“路由”结束时,我都有context.successed或context.fa

当我尝试运行下面的lambda函数时,我得到了添加到MySQL数据库中的适当值,但是,Alexa skill输出了一个错误,并且尝试从数据库中删除该值表明它会立即再次添加,直到我更改表名为止(然后我猜它会出错并最终停止)

当我从我的技能中调用任何Alexa意图时,我会触发MySQL位。我不太了解回调和Alexa上下文,所以我想我在处理它们时做了一些不正确的事情。似乎查询命令被调用了很多次,我不明白这一点,因为在每次回调“路由”结束时,我都有context.successed或context.fails,这将结束我的Lambda函数,并为Alexa提供它所需要的继续技能所需的输出

以下是我当前的代码:

var mysql = require('mysql');
var connection = mysql.createConnection({
    host: '-',
    user: '-',
    password: '-',
    database: '-'
});

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(err2, result) {
                                console.log("Inside connection.query() callback");
                                if (!err2) {
                                    console.log("Query Successful! Ending Connection.");
                                    connection.end(function(err3) {
                                        if (!err3) {
                                            console.log("Connection ended!")
                                            context.succeed(
                                                generateResponse({},
                                                    buildSpeechletResponse("Welcome to the incredible intelligent MySQLable Alexa!", true)
                                                )
                                            );
                                        } else {
                                            console.log("Ending connection failure!");
                                            context.fail("Ending connection failure! " + err3.message);
                                        }
                                    });
                                } else {
                                    connection.end(function(err3) {
                                        if (!err3) {
                                            console.log("Query error! Ending Connection!");
                                            context.fail(`Query error! Ending Connection!` + err2.message);
                                        } else {
                                            console.log("Query error and Error ending connection!" + err2.message + " " + err3.message);
                                            context.fail("Query error and Error ending connection!" + err2.message + " " + err3.message);
                                        }
                                    });
                                }
                            });
                    } else {
                        console.log("Error connecting database3 ..." + err.message);
                        context.fail("Error connecting database3 ... " + err.message);
                    }
                });

                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(`Exception: ${error}`);
    }

};

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

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

generateResponse = (sessionAttributes, speechletResponse) => {
    return {
        version: "1.0",
        sessionAttributes: sessionAttributes,
        response: speechletResponse
    };
};
编辑:从CloudWatch添加此函数的最后两个执行日志(2,因为它们发生了不同的事情,尽管我没有更改代码): 日志1:

日志2:

START RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Version: $LATEST
2017-03-10T21:12:44.518Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    NEW SESSION
2017-03-10T21:12:44.519Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Intent Request
2017-03-10T21:12:44.519Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Then run MySQL code:
2017-03-10T21:12:44.756Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Inside connection.connect() callback
2017-03-10T21:12:44.756Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Database is connected ... 
2017-03-10T21:12:44.799Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Inside connection.query() callback
2017-03-10T21:12:44.838Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Query error! Ending Connection!
2017-03-10T21:12:44.838Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
{
    "errorMessage": "Query error! Ending Connection!ER_DUP_ENTRY: Duplicate entry 'TESTNAME' for key 'PRIMARY'"
}

END RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
REPORT RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e  Duration: 333.25 ms Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 21 MB  
START RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee Version: $LATEST
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    NEW SESSION
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Intent Request
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Then run MySQL code:
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Inside connection.connect() callback
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Error connecting database3 ...Cannot enqueue Handshake after invoking quit.
2017-03-10T21:17:43.198Z    ffd37e18-05d6-11e7-bdde-15cef47016ee
{
    "errorMessage": "Error connecting database3 ... Cannot enqueue Handshake after invoking quit."
}

END RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee
REPORT RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee  Duration: 5.65 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 21 MB  

查看该函数的cloudwatch日志。它是被多次调用,还是只被一次调用?日志告诉你什么?我添加了最后两个错误日志。显然,某些代码似乎正在>一次地运行。如果您确实想在处理程序内断开与数据库的连接,请在处理程序内移动
var connection=mysql.createConnection
。处理程序之外的变量可能(而不是——它们可能)从一个调用持续到下一个调用(请参阅“容器重用”),因此您试图重用已断开的连接。知道为什么第一次失败并触发循环行为吗?我已删除了关于重复RequestID的注释。我的眼球在那上面发火了。我只见过一次。
START RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Version: $LATEST
2017-03-10T21:12:44.518Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    NEW SESSION
2017-03-10T21:12:44.519Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Intent Request
2017-03-10T21:12:44.519Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Then run MySQL code:
2017-03-10T21:12:44.756Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Inside connection.connect() callback
2017-03-10T21:12:44.756Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Database is connected ... 
2017-03-10T21:12:44.799Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Inside connection.query() callback
2017-03-10T21:12:44.838Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e    Query error! Ending Connection!
2017-03-10T21:12:44.838Z    4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
{
    "errorMessage": "Query error! Ending Connection!ER_DUP_ENTRY: Duplicate entry 'TESTNAME' for key 'PRIMARY'"
}

END RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
REPORT RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e  Duration: 333.25 ms Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 21 MB  
START RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee Version: $LATEST
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    NEW SESSION
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Intent Request
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Then run MySQL code:
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Inside connection.connect() callback
2017-03-10T21:17:43.197Z    ffd37e18-05d6-11e7-bdde-15cef47016ee    Error connecting database3 ...Cannot enqueue Handshake after invoking quit.
2017-03-10T21:17:43.198Z    ffd37e18-05d6-11e7-bdde-15cef47016ee
{
    "errorMessage": "Error connecting database3 ... Cannot enqueue Handshake after invoking quit."
}

END RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee
REPORT RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee  Duration: 5.65 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 21 MB