我正在实现一个Web应用程序,它调用lambda函数从数据库中获取数据。
我选择了无服务器Aurora并编写了代码,但是在查询方法中出现了异常"Error: Received packet in the wrong sequence."
。
我用Google搜索了这个问题,但是几乎所有的问题都太旧了。
一篇文章说这是browisify
的问题,但我不使用它。
我正在使用带打字稿的无服务器框架。
const mysql = require('serverless-mysql')({
config: {
host: process.env.DB_HOST,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD
}
});
export async function query(sql: string, param?: Array<string>): Promise<any> {
const results = await mysql.query(sql).catch(e => {
console.log(e); // Error: Received packet in the wrong sequence
throw new Error(e);
});
await mysql.end();
return results;
}
以下同样不起作用
export async function query(sql: string, param?: Array<string>): Promise<any> {
const connQueryPromisified = util
.promisify(connection.query)
.bind(connection);
const result = await connQueryPromisified(sql, param)
.then(row => {
console.log(row);
return row;
})
.catch(err => {
console.log(err); // getting Error: Received packet in the wrong sequence
throw err;
});
return result;
}
我也尝试使用RDS DATA服务,但在我所在的地区不可用。
export async function query(sql: string, param?: Array<string>): Promise<any> {
const params: aws.RDSDataService.Types.ExecuteSqlRequest = {
awsSecretStoreArn: '***',
dbClusterOrInstanceArn: '***',
database: '***',
schema: '***',
sqlStatements: sql
};
console.log(params);
try {
const rdsService = new aws.RDSDataService({
apiVersion: '2018-08-01',
region: 'ap-northeast-1'
});
return rdsService
.executeSql(params)
.promise()
.then(d => {
return d;
})
.catch(e => {
throw new Error(e);
});
} catch (err) {
console.log(err); // nothing to say
throw new Error(err);
}
}
这是我的配置:
webpack.config.js
const path = require('path');
const slsw = require('serverless-webpack');
module.exports = {
mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
entry: slsw.lib.entries,
devtool: 'source-map',
resolve: {
extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
},
output: {
libraryTarget: 'commonjs',
path: path.join(__dirname, '.webpack'),
filename: '[name].js',
},
target: 'node',
module: {
rules: [
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
{ test: /\.tsx?$/, loader: 'ts-loader' },
],
},
};
tsconfig.json
{
"compilerOptions": {
"lib": [
"es2017"
],
"moduleResolution": "node",
"sourceMap": true,
"target": "es2017",
"outDir": "lib"
},
"exclude": [
"node_modules"
]
}
我只想查询从无服务器Aurora获取记录。
有人可以帮我吗?
答案 0 :(得分:0)
发生这种情况的原因是因为Webpack(处于生产模式)正在通过最小化器放置您的代码,而mysql
使用的serverless-mysql
模块与最小化不兼容。
您可以在此处查看问题:https://github.com/mysqljs/mysql/issues/1655。 Node模块依靠函数名称进行代码构建是一个普遍的问题,因为丑陋的/缩小主义者试图通过将函数的名称更改为单个字母来混淆/节省空间。
最简单的解决方法是通过添加以下内容来关闭Webpack配置中的最小化:
optimization: {
minimize: false
}
链接的问题中有一些讨论,涉及将其他各种最小化插件(例如terser)配置为 not 杂项名称,这将使您在需要时获得一些最小化的好处。