【问题标题】:insert in for each with async await使用异步等待插入每个
【发布时间】:2019-10-14 07:52:04
【问题描述】:

查询执行出错

var records = [{name:'John',age:24},{name:'Sarah',age:28},{name:'Linda',age:23}];

connection.getSession().then(session => {
   async function insertRecords() {
      await Promise.all(records.map(async function (element) {
         let util = {};
         util['name'] = element['name'];
         util['age'] = element['age'] || null;                   
         let query = `INSERT INTO users SET
           name =?,
           age=?
           ON DUPLICATE KEY UPDATE
            name=VALUES(name),
            age=VALUES(age)`;

        session.sql(query).bind([util.name, util.age]).execute()
           .then(() => {})
           .catch((error) => {
              console.error('cannot execute the query');
              console.error('error', error);
           });
      }))
   }

   insertRecords()
      .then(data => console.log('data', data))
      .catch(err => console.log('err', err))

}).catch((err) => {
    console.error(err);
    session.close();
});

我在执行时收到以下错误。

{ 严重性:0, 代码:5015, sqlState: 'HY000', msg: '参数太多' } }

【问题讨论】:

  • 这是您的查询错误,而不是 async/await,对吧?
  • 如果我在工作台中执行查询似乎工作正常
  • 我从未见过 VALUES( 在 ON DUPLICATE KEY UPDATE 命令之后的语法。我无法告诉你为什么它在工作台中有效,但在节点中无效,但无论如何尝试删除它。
  • 查询看起来不错。但是,正如现有答案所指出的那样,异步处理存在一些问题。您使用的是什么版本的驱动程序?我无法重现这种行为。按原样使用您的代码 sn-p(使用具有有效架构的现有表)只会返回 data undefined。考虑到异步处理问题,这是有道理的。免责声明:我是 MySQL Node.js X DevAPI 驱动程序主管开发人员。

标签: mysql node.js asynchronous promise async-await


【解决方案1】:

在您的 Promise.all 中,您在 maprecords 但您的解析器函数不返回任何内容。你需要返回一个承诺。为此,您只需将 session.sql 块替换为以下内容:return session.sql(query).bind([util.name, util.age]).execute()

这将返回一个 Promises 数组到 Promise.all,它会起作用。当您调用 insertRecords 函数时,错误处理已经完成,因此您无需在解析器中担心它。

【讨论】:

  • 进行更改后我遇到了同样的错误
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-07-07
  • 2016-03-25
  • 2017-10-09
相关资源
最近更新 更多