"Error: Received packet in the wrong sequence." when connect to serverless aurora

"Error: Received packet in the wrong sequence." when connect to serverless aurora

我正在实现一个 Web 应用程序,它调用 lambda 函数从数据库中获取数据。
我选择了Serverless Aurora,写了一段代码,但是在查询方法中出现了异常"Error: Received packet in the wrong sequence."

我用谷歌搜索了这个问题,但几乎所有问题都太旧了。
一篇文章说是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"
  ]
}

我只想查询从 Serverless Aurora 获取的记录。
有人可以帮助我吗?

发生这种情况的原因是 Webpack(在生产模式下)正在通过最小化程序放置您的代码,而 serverless-mysql 使用的 mysql 模块与最小化不兼容。

您可以在此处查看问题:https://github.com/mysqljs/mysql/issues/1655。这是依赖函数名称进行代码构建的 Node 模块的一个常见问题,因为 uglyifiers/minifiers 试图通过将函数名称更改为单个字母来 obfuscate/save space。

最简单的解决方法是通过添加以下内容来关闭 webpack 配置中的最小化:

  optimization: {
    minimize: false
  }

链接问题中有一些关于将各种其他最小化插件(如 terser)配置为 not mangle 名称的讨论,这将使您获得最小化的一些好处如果你需要的话。

你可以使用支持promises的mysql2