带节点 MySQL 的无服务器框架:PROTOCOL_INCORRECT_PACKET_SEQUENCE 错误

Serverless Framework with Node MySQL: PROTOCOL_INCORRECT_PACKET_SEQUENCE error

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

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

我在 Google、Whosebug 或 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);
        });
    };

我刚刚遇到了完全相同的问题。

问题出在 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

编辑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

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

无服务器 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"
    ]
  }
}

对于未来的任何人

我在 webpack.config.js 文件中添加以下内容的方法

optimization: {
    minimize: false
}

Mysql 似乎不喜欢缩小