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

时间:2019-05-05 05:01:54

标签: node.js aws-lambda amazon-rds-aurora aws-sdk-js

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

1 个答案:

答案 0 :(得分:0)

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

您可以在此处查看问题:https://github.com/mysqljs/mysql/issues/1655。 Node模块依靠函数名称进行代码构建是一个普遍的问题,因为丑陋的/缩小主义者试图通过将函数的名称更改为单个字母来混淆/节省空间。

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

  optimization: {
    minimize: false
  }

链接的问题中有一些讨论,涉及将其他各种最小化插件(例如terser)配置为 not 杂项名称,这将使您在需要时获得一些最小化的好处。