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函数,以便没有范围混淆。