当前位置: 首页 > 知识库问答 >
问题:

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

蓟清野
2023-03-14

我在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安装在index.js目录中的“mysql”模块,并将其压缩和上传到我的Lambda函数中。

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

我的问题延伸到了Alexa和Lambda,也延伸到了mysql节点的正确使用。JS模块。

这是我当前的 Lambda 代码,当然,这里的问题仍然是我的测试值 -

正如第一条评论所建议的那样,我将查询放入连接回调中,并且我正在放置我的新代码而不是更新上面的旧代码,只是为了记录我认为代码应该如何过渡到我的 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  

共有1个答案

龙飞文
2023-03-14

问题是我需要把我的背景放在一起。在我的回调中成功。非常感谢sqlbot,因为他关于回调的演讲让我研究了事情实际上在哪里结束了执行。

因此,很明显,当使用AWS Lambda时,如果“上下文”在调用回调之前结束,则不会得到回调。所以,即使我已经这样放置了所有的回调:连接-

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

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
    };
};
 类似资料:
  • 问题内容: 我想创建一个使用查询来计算值的函数,但返回值时遇到问题: 简而言之,我的查询是: 我收到一个SQL语法错误。 SQL错误(1064):您的SQL语法有错误; 问题答案: 假设这些都是通用名称(表将不是一个很好的表名),问题是您不能使用==进行比较。您还缺少一些关键语法(DECLARE,SELECT INTO等)。 更改为此: MySQL比较函数和运算符 相关问题:MYSQL中的单等于

  • 主要内容:查询表中所有字段,查询表中指定的字段在MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: 包含星号通配符的字段列表,表示所要查询字段的名称。 ,表 1 和表 2 表示查询数据的来源,可以是单个或多个。 是可选项,如果选择该项,将限定查询数据必须满足该查询条件。 ,该子句告

  • 问题内容: 我正在尝试使用sql语句从XML文档中获取特定数据。该文件如下: 我输入了sql查询以获取球体中值,如下所示: 但是我出错了 [错误]执行(4:17):ORA-19228:XPST0008-未声明的标识符:前缀’nsREF’本地名称’nsREF:Measure’ 您能帮我获得正确的价格吗 问题答案: Oracle安装程序 查询 : 输出 :

  • 我正试图从firebase数据库中获取项目列表。。。但我很难得到它们。我的代码大致如下: 应该返回我的项目的方法如下所示: GetItems()总是返回一个空列表,这有点道理,因为在我返回这个列表之前,没有什么可以触发onDataChange事件,所以我的问题是。。。如何使用此方法从DB返回项目列表?

  • 我正在为Discord制作一个机器人,这个机器人的一个功能是一个级别系统。我决定从使用JSON存储数据转向使用sqlite。我正在node.js中使用sqlite3,并试图创建一个函数来创建/检索播放器的数据。我的目标是让这个函数返回查询中的数据,但我正在努力找出我做错了什么。我已经读到,我需要使用发送到查询函数的回调,但这对我来说也不起作用(对于这个函数的目标也不起作用)。 因此,任何关于如何创

  • SqliteOpenHelper只是一个工具,是SQL世界和OOP之间的一个通道。我们要新建几个类来请求已经保存在数据库中的数据,和保存新的数据。被定义的类会使用ForecastDbHelper和DataMapper来转换数据库中的数据到domain models。我仍旧使用默认值的方式来实现简单的依赖注入: class ForecastDb( val forecastDbHelper: