gpt4 book ai didi

javascript - 错误的编译顺序

转载 作者:行者123 更新时间:2023-11-30 17:42:48 29 4
gpt4 key购买 nike

我想检查一个用户是否已经在我的数据库(sqlite3)中。

  • 如果用户存在:返回 500(错误!!)
  • 如果用户不存在:返回200(ok)

这就是我的脚本:服务器端的 node.js+express。

app.post('/adduser', function(req,res){
db.serialize(function(){
var user = req.body.user;
var password = req.body.password;
var err = false;

db.each("SELECT name FROM users", function(err, row) {
if (user == row.name) {
console.log(row.name);
err = true;
console.log("a: " +err);
res.send(500);
return false;
}
});

if (err==false) {
console.log("b: " +err);
res.send(200);
}

})
});

无论我是否提交现有用户名,我总是得到成功代码 200。那是来自服务器的日志:

b: false
testuser
a: true

我输入了一个现有用户,但代码为 200。奇怪,我在 a 之前得到了 b

最佳答案

您的数据库查询是异步调用的。即使您指定了 db.serialize,这将导致 sqlite 按照您指定的顺序运行其 sql 查询,数据库查询也会分离。

这意味着当收到结果时调用来自 DB 的响应(“db.each ...”中的匿名回调函数)。

但是,程序会继续运行,首先调用您的“if (err==false) ...”。

例如:

    var err = false; // called first

db.each("SELECT name FROM users", function(err, row) {
// called 3rd (after result from DB/disk)
});

if (err==false) {
// called second
}

db.each() 函数还接受第三个参数(参见 API Documentation ),在所有查询完成时调用。据此,您的代码应如下所示:

app.post('/adduser', function(req,res){
db.serialize(function(){
var user = req.body.user;
var password = req.body.password;
var err = false;

db.each("SELECT name FROM users", function(err, row) {
if (user == row.name) {
console.log(row.name);
err = true;
console.log("a: " +err);
res.send(500);
return false;
}
}, function() {
if (err==false) {
console.log("b: " +err);
res.send(200);
}
});
})
});

在编写 node.js 代码时,您应该始终牢记任何磁盘/io/net/db/等。调用async,回调中的代码会在后面的代码之后执行。

关于javascript - 错误的编译顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722408/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com