繁体   English   中英

带有 Node 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、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);
        });
    };

通常,您遇到的问题是 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配置文件。

Node v5Node v5 中包含的 NPM 可执行文件在内部执行依赖项优化和依赖项模块扁平化。 这与当前的无服务器优化器插件并不真正兼容。 这里的解决方案是添加 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"
    ]
  }
}

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

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

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

对于未来的任何到来

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

optimization: {
    minimize: false
}

Mysql 似乎不喜欢缩小

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM