“错误:收到的数据包顺序错误。”当连接到无服务器 aurora 时

问题描述 投票:0回答:3

我正在实现一个 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 获取的记录。
有人可以帮助我吗?

node.js aws-lambda amazon-aurora aws-sdk-js
3个回答
21
投票

发生这种情况的原因是因为 Webpack(在生产模式下)将您的代码置于最小化器中,而

mysql
正在使用的
serverless-mysql
模块与最小化不兼容。

您可以在这里查看问题:https://github.com/mysqljs/mysql/issues/1655。对于依赖函数名称来进行代码构建的 Node 模块来说,这是一个相当常见的问题,因为丑陋的工具/压缩工具试图通过将函数名称更改为单个字母来混淆/节省空间。

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

  optimization: {
    minimize: false
  }

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


3
投票

您可以使用支持promise的mysql2 https://stackoverflow.com/a/62255084/1031304


0
投票

我已经在cpanel上安装了nodejs应用程序,并使用了mysql 对于连接,我已经切换回 mysql2/promise 包,那么它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.