2015-04-12 43 views
0

我有一個node.js的JS sqlite3的控制器功能:爲什麼JS函數的控制sqlite3數據庫的執行順序不是一步一步的?

exports.findUser=function findUser(user){ 
var temp ; 
var db = new sqlite3.Database('kitchen.db'); 
var stmt_user_find = "SELECT * FROM user WHERE un = ?"; 
db.all(stmt_user_find,user,save); 
function save(err, rows) { 
    if (err) throw err; 
    console.log(rows); 
    temp = rows; 
} 
db.close(); 
return temp; 

}

,並使用Express在路由器的另一個功能:

app.post('/login', function (req, res){ 
    var un=req.body.un; 
    var pw=req.body.pw; 

     console.log('router '+db.findUser(un)); 

}); 

控制檯的結果是:

router undefined 
[ { un: 'as', em: 'sss', pw: 'sss' } ] 

第二個函數旨在從sqlite數據庫,但是控制檯的結果顯示'return temp'語句首先被執行並返回到第二個函數,然後執行findUser函數的內部函數(save)。那麼爲什麼它是這樣的,我怎樣才能從數據庫中獲得價值?

謝謝你,我已經在這個問題上試了幾個小時。

+4

因爲它是異步的? – zerkms

+0

是的,從sqlite文件,它是異步的,所以我怎麼能得到的價值....我在尋找答案 – Hope

+0

他們在回調函數。你已經把它們放入'rows'變量中。 – zerkms

回答

-1

節點不會等待數據庫調用完成以繼續執行代碼,因此您必須強制它執行此操作。您發佈的代碼在定義之前返回變量'temp',然後在數據庫調用完成後,回調(您的'保存'功能)爲其分配值。試試這個:

exports.findUser=function findUser(user){ 
    var temp ; 
    var db = new sqlite3.Database('kitchen.db'); 
    var stmt_user_find = "SELECT * FROM user WHERE un = ?"; 

    function save(err, rows) { 
     if (err) throw err; 
     console.log(rows); 
     temp = rows; 
     db.close(); 
     return temp; 
    } 
    db.all(stmt_user_find,user,save); 
} 

現在findUser功能不會返回,直到該數據庫調用完成後,因爲return語句是回調裏面。如果您想了解更多,this link是一個很好的開始。

編輯:我的道歉,當然上述不會奏效。你需要給自己一個回調。試試這個:

exports.findUser=function findUser(user, callback){ 
    var temp ; 
    var db = new sqlite3.Database('kitchen.db'); 
    var stmt_user_find = "SELECT * FROM user WHERE un = ?"; 
    var finduser = this; 

    db.all(stmt_user_find,user, function(err, rows){ 
     if (err) throw err; 
     console.log(rows); 
     temp = rows; 
     db.close(); 
     return callback(temp); 
    }); 
} 

而在你的路線:

app.post('/login', function (req, res){ 
    var un=req.body.un; 
    var pw=req.body.pw; 

    db.finduser(un, function(found_user) { 
     console.log('router '+db.findUser(un)); 
    }); 
}); 

我沒有設置你的環境,所以我無法測試的代碼,但希望其基本思路是清晰的。

+0

我試過這個,但'返回'是爲函數'save',而不是主函數'findUser',所以結果仍然是一樣的...... – Hope

+0

如果給自己一個回調,你應該可以解決這個問題。我編輯了我的答案來演示如何這樣做。 – remyp

+0

這就是答案!這有效,回調是一個非常聰明的方法在異步環境中,我也發現了另一種[方式](http://stackoverflow.com/questions/17954743/node-js-and-express-passing-sqlite-data-to-one -of-my-views),但我沒有嘗試它,似乎打破了數據庫控制器的清晰結構。非常感謝你! – Hope

相關問題