我写了一个名为accountManager.js的模块
var sqlite3 = require('sqlite3');
var db = new sqlite3.Database("./users.db");
exports.userExists = function userExists(nickName) {
var stmt = 'SELECT * FROM users WHERE login="' + nickName + '"';
db.each(stmt,function(err,row) {
if(row) {
if(row.login==nickName) return true;
else return false;
}
});
}
在我的主app.js文件中,我有
var accountManager = require('./lib/accountManager');
console.log(accountManager.userExists('user1'));
此应用程序在控制台中显示“未定义”...我检查该模块工作正常,我猜这是回调问题?请给我一些帮助,我不明白这段代码有什么问题...
答案 0 :(得分:2)
您需要了解异步函数和回调如何工作。
基本上你不能在回调中返回任何内容,但需要调用你传递给userExists
的另一个回调。
var sqlite3 = require('sqlite3');
var db = new sqlite3.Database("./users.db");
exports.userExists = function userExists(nickName, cb) {
var stmt = 'SELECT * FROM users WHERE login="' + nickName + '"';
db.each(stmt,function(err,row) {
if(row) {
cb(row.login == nickName);
}
});
}
使用它:
accountManager.userExists('user1', function(found) {
console.log(found);
});
除此之外,您的代码有一个空洞的SQL注入漏洞,可能无法执行您想要执行的操作。这是userExists
函数的固定版本:
exports.userExists = function userExists(nickName, cb) {
var stmt = 'SELECT COUNT(*) AS cnt FROM users WHERE login = ?';
db.get(stmt, nickName, function(err, row) {
cb(row.cnt > 0);
});
};
为什么这样更好?
答案 1 :(得分:0)
您正在从db.each
的回调中返回一个值。但是,外部函数(userExists
)返回的值 not ,它可能会在调用传递给db.each
的函数之前返回。
您可能希望向userExists
函数提供回调,如下所示:
exports.userExists = function (nickName, cb) {
var stmt = 'SELECT * FROM users WHERE login="' + nickName + '"';
var found=false;
db.each(stmt,function(err,row) {
if(row) {
if(row.login==nickName) {
found=true;
cb(true);
}
}
}, function () {
if (!found) {
cb(false);
}
});
}
然后,将其称为:
var accountManager = require('./lib/accountManager');
accountManager.userExists('user1', function (found) {
console.log(found);
});