node.js
  • module
  • callback
  • 2013-05-18 87 views 1 likes 
    1

    接收自定義模塊的數據,我寫了一個名爲accountManager.js我不能在node.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')); 
    

    這應用程序在控制檯中顯示'undefined'...我檢查了該模塊工作正常,我想這是回調問題?請給我一些幫助,我不明白這個代碼有什麼問題...

    回答

    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. 現在回調總是被調用。在第一個更接近你的代碼的例子中,只有在找到用戶的情況下才會調用它 - 很可能不是你想要的。
    +0

    謝謝!現在很清楚:) – Quak

    +0

    但是你的數據庫查詢出錯了。它說'錯誤'。行[0]未定義,它看起來像暱稱不傳遞給'stmt' – Quak

    +1

    @ user1946059:[Fixed](http://stackoverflow.com/posts/16628760/revisions)。看起來你不能通過node-sqlite中的索引訪問行... – ThiefMaster

    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); 
    }); 
    
    相關問題