1

我在 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);
        });
    };
4

4 回答 4

3

通常,您遇到的问题是 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 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"
    ]
  }
}
于 2016-03-14T11:32:40.690 回答
1

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

于 2015-11-26T07:09:02.973 回答
0

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

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

于 2015-10-22T19:25:20.173 回答
0

对于未来的任何人

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

optimization: {
    minimize: false
}

Mysql 似乎不喜欢缩小

于 2021-12-15T20:06:33.380 回答