带节点 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、Whosebug 或 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);
});
};
我刚刚遇到了完全相同的问题。
问题出在 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
编辑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"
]
一般来说,您遇到的问题是 serverless-optimizer-plugin 无法正确处理动态加载的 NPM 模块或全局变量(例如,使用 mysql NPM 包时)。所以你必须将它排除在优化之外。
解决方案在很大程度上取决于您使用的无服务器版本和节点版本,因此我将在下面列出不同的解决方案:
无服务器 v4 + 节点 v4:
按如下方式在 s-component.json
中设置排除项:
"custom": {
"optimize": {
"exclude": [
"aws-sdk",
"mysql"
],
"includePaths": [
"node_modules/mysql"
]
}
}
无服务器 v5 + 节点 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"
]
}
}
对于未来的任何人
我在 webpack.config.js 文件中添加以下内容的方法
optimization: {
minimize: false
}
Mysql 似乎不喜欢缩小
我在 AWS Lambda NodeJS(使用无服务器框架)上实现简单查询时遇到困难。 运行 它在本地工作,但是当我将它上传到 AWS 然后尝试使用 API 网关端点 运行 它时,我收到此错误:
{
"code": "PROTOCOL_INCORRECT_PACKET_SEQUENCE",
"fatal": true
}
我在 Google、Whosebug 或 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);
});
};
我刚刚遇到了完全相同的问题。
问题出在 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
编辑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"
]
一般来说,您遇到的问题是 serverless-optimizer-plugin 无法正确处理动态加载的 NPM 模块或全局变量(例如,使用 mysql NPM 包时)。所以你必须将它排除在优化之外。 解决方案在很大程度上取决于您使用的无服务器版本和节点版本,因此我将在下面列出不同的解决方案:
无服务器 v4 + 节点 v4:
按如下方式在 s-component.json
中设置排除项:
"custom": {
"optimize": {
"exclude": [
"aws-sdk",
"mysql"
],
"includePaths": [
"node_modules/mysql"
]
}
}
无服务器 v5 + 节点 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"
]
}
}
对于未来的任何人
我在 webpack.config.js 文件中添加以下内容的方法
optimization: {
minimize: false
}
Mysql 似乎不喜欢缩小