1

我写了一个名为 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'));

这个应用程序在控制台中显示“未定义”...我检查了该模块工作正常,我猜是回调的问题?请给我一些帮助,我不明白这段代码有什么问题......

4

2 回答 2

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. 您不插入 SQL 字符串中的值(这很糟糕,您必须转义内容以避免 SQL 注入)。单独传递它更干净,更好
  2. 您只想知道用户是否存在。所以检索计数(这将是一行)。如果它不为零,则用户存在。
  3. 现在回调总是被调用。在第一个示例中,它更接近于您的代码,只有在找到用户的情况下才会调用它 - 很可能不是您想要的。
于 2013-05-18T20:43:04.273 回答
0

您正在从回调中返回一个值db.each。但是,外部函数 ( )不会返回此值userExists,它可能会在传递给的函数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);
 });
于 2013-05-18T20:47:25.720 回答