JavaScript – 编译错误的序列

我想检查,如果用户已经在我的数据库(sqlite3)。

  • 如果用户存在:return 500(ERROR !!)
  • 如果用户不存在:return 200(ok)

那是我的脚本:node.js +表示在服务器端。

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.奇怪的是,我之前得到b

您的数据库查询是asynchronous调用的。 即使你指定了db.serialize,这会导致sqlite以你指定的顺序运行它的sql查询,但是DB查询是分离的。

这意味着当接收到结果时,将调用DB(“db.each …”中的匿名callback函数)的响应。

但是,程序进一步运行,首先调用你的“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文档 ),以便在所有查询完成时调用。 据此,你的代码应该是这样的:

 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 / etc。 被称为asynchronous,callback代码将在下面的代码后执行。

'each'函数将与结果集中的每一行asynchronouscallback。 您可以添加一个完成处理程序作为最后一个参数,一旦所有的行已被返回,将被调用。

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

注:我也修改了第一个参数到您的第一个callback函数,以便没有范围混淆。