我们有一个节点服务器,它不能异步处理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)
。
感谢任何帮助!