带有Node MySQ的无服务器框架,错误PROTOCOL_INCORRECT_PACKET_SEQUENCE

时间:2015-10-21 14:18:54

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

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

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

我无法在google,stackoverflow或git上发现有关此错误的任何回复。而且我无法弄清楚我做错了什么。

这就是我正在尝试的。

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);
    });
};

3 个答案:

答案 0 :(得分:3)

通常,您遇到的问题是无服务器优化器插件无法正确处理动态加载的NPM模块或全局(例如,在使用mysql NPM包时)。所以你必须将它从优化中排除。 解决方案在很大程度上取决于您使用的无服务器版本和节点版本,因此我将列出以下不同的解决方案:

Severless v4 + Node v4

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

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

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

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

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

不幸的是(再一次)这样做是行不通的。出于某种原因,所有文件都在'node_module'文件夹中,以便在上传软件包之前将文件取出。

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

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