2016-11-16 12 views
0

Node、Express、MySQLに基本的なWebアプリケーションを作成しています。ユーザーがアカウントを作成したり、他の人のアカウントを見たり、自分のプロフィールに情報を投稿したりできる、基本的なサイトです.NodeとJavaScriptを学ぶために作成しています。 私はuserlistを作成しています。データベース内のすべてのユーザーを返す素敵な関数を作成しました。ここでは、コードは次のとおりです。NodeJS/Javascript関数が未定義の場合

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(); 

おかげ

--- EDIT - - 私はまた、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

あなたは正しい '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