使用节点MySQ的无服务器框架,错误PROTOCOL_INCORRECT_PACKET_SEQUENCE

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

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

我无法find任何反应在谷歌,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); }); }; 

编辑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无法正确处理dynamic加载的NPM模块或全局variables(例如使用mysql NPM包时)。 所以你必须从优化中排除它。 该解决scheme在很大程度上取决于您使用的无服务器版本和Node版本,因此我将列出以下不同的解决scheme:

Severless v4 + Node v4

在你的s-component.json设置排除如下:

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

无服务器v5 + Node v4 :组件已经过时,并且在这个无服务器版本中被移除,而不是使用函数。 因此,将优化器configuration直接应用到您的s-function.jsonconfiguration文件。

节点v5Node v5附带的NPM可执行文件在内部进行依赖关系优化和依赖模块展平。 这与当前的serverless-optimizer-plugin不兼容。 这里的解决scheme是在@Masatsugu Hosoi的回答中添加已经被NPM优化过的依赖,就像这样

 "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" ] } } 

我只是有这个完全一样的问题。

问题是与browserify和mysql模块。 不幸的是我找不到一个真正的解决scheme。

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

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

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

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

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

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