节点服务器未正确处理来自客户端的异步发布请求

时间:2017-08-22 15:18:34

标签: javascript node.js async-await

我们有一个节点服务器,它不能异步处理post请求。当请求同步时,它处理它们很好。

有一个节点api服务器并且模仿一个客户端,有一个节点脚本向服务器发出一个post请求。

在同步循环中发出单个帖子请求或发布请求时,一切都按预期工作。

在循环中向服务器发出异步发布请求时,代码无法正常执行。

这是服务器端的代码。从router.post()方法调用此方法。

async insert(params) {
  let account = new Account();
  try {
    let totalLicenses = await this.getLicenses(params);

    if (totalLicenses === 0) throw new AccountError('NO_AVAILABLE_LICENSE');

    let accountResponse = await account.insert(params);
    let useLicense = await license.use(accountResponse, params);

    /*
      Do other account setup stuff here
    */

    return accountResponse;
  } catch(err) {
    throw err;
  }
}

getLicenses(params)是一个异步函数,用于准备sql查询并等待来自queryDb方法的响应,该方法将回调包装在promise中。这是代码:

getLicense(params) {
  let vals = [...arguments],
      sql = 'my sql query';

  try {
    return await queryDb(sql, val);
  } catch (err) {
    throw new Error()
  }
}

我们正在使用mysql包与db通信。这就是queryDb方法的样子。

queryDb(query, vals) {
  return new Promise( (resolve, reject) => {
    connection.query(query, vals, (err, results, fields) => {
      if (err) reject(err);

      resolve(results);
    }
  }
}

在循环中向服务器发出异步后请求时,上面的insert方法为请求执行this.getLicenses(params)方法,然后为请求调用account.insert(params),然后为license.use(accountResponse, params)调用请求。

当让我们说客户端有3个可用许可证并且他们发送5个异步发布请求时,这就成了一个问题。从技术上讲,它应该为最后2个请求抛出错误,但事实并非如此。最终发生的是,它会插入所有5个帐户,因为它会在继续插入帐户之前为所有5个请求调用this.getLicenses(params)

感谢任何帮助!

0 个答案:

没有答案