【问题标题】:Serverless Framework with Node MySQL: PROTOCOL_INCORRECT_PACKET_SEQUENCE error带有节点 MySQL 的无服务器框架:PROTOCOL_INCORRECT_PACKET_SEQUENCE 错误
【发布时间】:2021-12-16 04:06:33
【问题描述】:

我在 AWS Lambda NodeJS(使用无服务器框架)上实现简单查询时遇到了困难。在本地运行它可以工作,但是当我将它上传到 AWS 然后尝试使用 API Gateway 端点运行它时,我收到了这个错误:

{
    "code": "PROTOCOL_INCORRECT_PACKET_SEQUENCE",
    "fatal": true
}

我在 Google、StackOverflow 或 GitHub 上找不到有关此错误的任何信息,而且我不知道我做错了什么。

这就是我正在尝试的。

    var mysql = require('mysql');

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

    function getLists (client_id,api_key,callback){
        connection.query("SELECT * FROM list WHERE client_id = ?",
        [client_id],function(error, results){
            connection.end();
            callback(error,results);
        }
    )};

    module.exports.run = function(event, context, cb) {
        getLists(event.x_mail_list_client_id,'',function(error,results){
            if(error){
                return cb(null,error);
            }
            return cb(null,results);
        });
    };

【问题讨论】:

    标签: mysql node.js aws-lambda aws-api-gateway serverless-framework


    【解决方案1】:

    一般来说,您遇到的问题是 serverless-optimizer-plugin 无法正确处理动态加载的 NPM 模块或全局变量(例如,在使用 mysql NPM 包时)。因此,您必须将其排除在优化之外。 解决方案很大程度上取决于您使用的无服务器版本和 Node 版本,因此我将在下面列出不同的解决方案:

    无服务器 v4 + 节点 v4

    s-component.json 中设置排除项,如下所示:

    "custom": {
      "optimize": {
        "exclude": [
          "aws-sdk",
          "mysql"
        ],
        "includePaths": [
          "node_modules/mysql"
        ]
      }
    }
    

    无服务器 v5 + 节点 v4: 在这个有利于功能的无服务器版本中,组件已被淘汰和删除。因此,将优化器配置直接应用到您的 s-function.json 配置文件中。

    节点 v5: Node v5 包含的 NPM 可执行文件在内部进行依赖优化和依赖模块展平。这与当前的 serverless-optimizer-plugin 尚不兼容。这里的解决方案是添加已经由 NPM 优化的依赖项,正如@Masatsugu Hosoi 在他上面的回答中提出的那样

    "custom": {
      "optimize": {
        "exclude": [
          "aws-sdk",
          "mysql"
        ],
        "includePaths": [
          "node_modules/mysql",
          "node_modules/bignumber.js",
          "node_modules/readable-stream",
          "node_modules/isarray",
          "node_modules/core-util-is",
          "node_modules/inherits",
          "node_modules/string_decoder"
        ]
      }
    }
    

    【讨论】:

      【解决方案2】:

      编辑 awsm.json。

      "exclude": [
        "aws-sdk",
        "mysql"
      ],
      "includePaths": [
        "node_modules/mysql",
        "node_modules/bignumber.js",
        "node_modules/readable-stream",
        "node_modules/isarray",
        "node_modules/core-util-is",
        "node_modules/inherits",
        "node_modules/string_decoder"
      ]
      

      https://github.com/felixge/node-mysql/issues/1249

      【讨论】:

      • 我几周前解决了,但我忘记了这个问题仍然悬而未决,这是正确的答案,谢谢=)
      【解决方案3】:

      我刚刚遇到了同样的问题。

      问题出在 browserify 和 mysql 模块上。不幸的是,我找不到真正的解决方案。

      通过阅读代码,browserify 是作为构建器的唯一可用选项。

      https://github.com/jaws-framework/JAWS/blob/master/lib/commands/deploy_lambda.js

      您可以将“builder”设置为 false。这将简单地压缩所有文件,然后再将它们发送到亚马逊。

      不幸的是(再次)这样做是行不通的。出于某种原因,所有文件都在“node_module”文件夹中才能工作,您必须在上传包之前取出文件。

      不过,这一切都是手动的……

      编辑:关于最后一部分已经有一个未解决的问题: https://github.com/jaws-framework/JAWS/issues/239

      【讨论】:

      • 当你回复我的帖子时我才意识到这一点,所以,我希望我们能找到解决方案,或者等待解决这个问题的拉取请求。
      • 嗨佩德罗。很高兴找到有同样问题的其他人(或者不是大声笑)。这是我在节点 mysql repo 上的问题:github.com/felixge/node-mysql/issues/1249
      【解决方案4】:

      未来的任何事情

      webpack.config.js 文件中添加以下内容对我有用

      optimization: {
          minimize: false
      }
      

      Mysql 似乎不喜欢缩小

      【讨论】:

      • 谢谢。这很好用。我正在使用 ERB,电子反应样板
      猜你喜欢
      • 2016-06-28
      • 2019-02-20
      • 2019-07-15
      • 2018-09-13
      • 2018-09-17
      • 2017-08-10
      • 2021-08-18
      • 2020-09-25
      • 2021-05-12
      相关资源
      最近更新 更多