我在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);
});
};
答案 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"
]
答案 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