【发布时间】:2017-02-25 02:18:14
【问题描述】:
读完https://stackoverflow.com/a/14797359/4158593:关于nodejs单线程,它接受异步函数的第一个参数,处理它,然后在一切准备好时使用回调来响应。让我感到困惑的是,如果我有多个查询需要一次全部排除,并告诉 nodeJS 通过将它们添加到队列中来阻止其他请求。
为此,我意识到我需要将我的查询包装在另一个 callback 中。并且承诺做得很好。
const psqlClient = psqlPool.connect();
return psqlClient.query(`SELECT username FROM usernames WHERE username=$1`, ['me'])
.then((data) => {
if(!data.rows[0].username) {
psqlClient.query(`INSERT INTO usernames (username) VALUES ('me')`);
}
else { ... }
});
此代码在注册期间使用,以检查在插入之前是否未使用用户名。所以nodejs将其他请求放入队列非常重要,并确保select和insert同时进行。因为此代码可能允许同时发送的具有相同用户名的人选择已被使用的用户名,因此将插入两个用户名。
问题
上面的代码是否一次执行所有查询?
-
如果
1是正确的,如果我要像这样更改代码const psqlClient = psqlPool.connect(); return psqlClient.query(`SELECT username FROM usernames WHERE username=$1`, ['me'], function(err, reply) { if(!reply.rows[0].username) { psqlClient.query(`INSERT INTO usernames (username) VALUES ('me')`); } });这会影响行为吗?
如果
1错了,该如何解决?我将需要这种模式(主要使用select和insert/update一个接一个),例如通过将每个文件的计数存储在我的数据库中来确保我的XML站点地图不包含超过50000个网址动态的。
【问题讨论】:
标签: node.js postgresql promise es6-promise