2016-11-16 231 views
0

我在Node,Express和MySQL中編寫基本的Web應用程序。它只是一個基本的網站,用戶可以創建一個帳戶,查看其他人的帳戶,並在他們的個人資料上發佈信息,並且我正在創建它來學習Node和javascript。 因此,我正在創建用戶列表,並且創建了一個很好的函數來返回數據庫中的所有用戶。下面是代碼:NodeJS/Javascript函數返回undefined

function getAllUsers() { 
    var query = " \ 
    SELECT \ 
     id, username, email, password \ 
    FROM \ 
     users \ 
    "; 
    connection.query(query, function(err, rows) { 
     if (err) throw err; 
     return rows; 
    }); 
} 

現在,我在這裏使用這個功能:

router.get('/list', function(req, res) { 
    var users; 
    users = getAllUsers(); 
    res.render('user/list', {'title': 'Users', 'users': users}); 
}); 

但用戶是不確定的。爲什麼是這樣?

我敢肯定,MySQL連接工作正常,但這裏是我如何連接它,萬一它派上用場:

var connection = mysql.createConnection({ 
    host: 'localhost', 
    user: 'root', 
    password: 'password', 
    database: 'firstnodeapp' 
}); 

connection.connect(); 

感謝

---編輯 - - 我想我也應該提到,行是在getAllUsers()函數中定義的,但是一旦我返回它就不再定義。

+1

'getAllUsers'是異步的,如何返回值? [試試這個](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call?noredirect=1&lq=1) –

+0

掛上...我不認爲這應該被標記爲重複。我的問題不是「如何從異步函數返回」...雖然答案是相關的,但問題不是... – IHazza

回答

1

回調救援(最簡單的答案)

您的查詢執行異步的,這意味着,當函數結束查詢仍在執行,你的「用戶」可變兩端是不確定的。

只是這樣做:

function getAllUsers(callback) { 
    var query = " \ 
    SELECT \ 
     id, username, email, password \ 
    FROM \ 
     users \ 
    "; 
    connection.query(query, callback); 
} 

router.get('/list', function(req, res) { 
    getAllUsers(function(err, rows) { 
      // Or better yet, respond with the correct html code 
      if (err) throw err; 

      res.render('user/list', {'title': 'Users', 'users': rows}); 
    }); 
}); 

它應該工作得很好。研究回調/承諾/觀察對象

+0

You're right'getAllUsers'不按設計返回任何東西。它僅通過回調方法產生值*。 – tadman

+0

謝謝,這也很有效:D – IHazza

0

難道你不忘記回來?

function getAllUsers() { 
    ... 

    var query_result = connection.query(query, function(err, rows) { 
    if (err) throw err; 
    return rows; 
    }); 

    return query_result; 
} 
+0

aha ...我從查詢函數而不是getAllUsers()函數返回...但這段代碼抱怨沒有被定義的行? – IHazza

+0

我編輯了我的答案,請立即嘗試。 – medik

+0

謝謝,完美的工作:)我很驚訝,我沒有注意到這個我自己! – IHazza