2

Express アプリがあり、データベースから取得したものを表示したいとします。これを含むファイルがあります(データベースとのやり取りに node-mysql を使用)

exports.getData = function() {                                                                   
  connection.query('SELECT * FROM table', function (error, rows, fields) {                                                                                    
    return rows[0];                                                                               
  });                                                                                                                                                                       
}

それを呼び出して、データをテンプレート言語に渡すことができれば幸いです。ただし、関数が終了するまでコールバックが返されず、getData が undefined を返すため (私が思うに)、そのようには機能しません。

コールバックに関する重要な「あはは」の瞬間を見逃しているに違いありません。データベースとやり取りしたい場合、routes/index.js (提供しているページのコントローラー) ですべてのロジックを実行し、一連のコールバックの最後にページを最後にレンダリングする必要がありますか?

4

4 に答える 4

3

getData()エクスポートされる引数としてコールバックを渡します...

exports.getData = function(callback) {                                                                   
  connection.query('SELECT * FROM table', function (error, rows, fields) {                                                                                    
    callback(error, rows[0]);                                                                               
  });                                                                                                                                                                       
}

次に、できること...

var data = require("data");
data.getData(function(error, firstRow) {  });

Tadman は、最初の引数がエラーに対するものであるという規則に従うことを適切に提案しました。このようにして、エラー情報を伝播できます。

于 2013-10-10T18:50:27.320 に答える
0

このリンクの「約束」を使用して、詳細情報を見つけることができます

Promise は、非同期コードを処理するときに生のコールバックに代わる強力な手段を提供します。残念ながら、Promise は混乱を招く可能性があり、おそらくそれらを無視してしまった可能性があります。ただし、相互運用可能で検証可能な方法で Promise の本質的な美しさを引き出すために、重要な作業が行われています。その結果が Promises/A+ であり、Promise ライブラリーや DOM にも採用されつつある仕様です。

var promise = (connection.query('SELECT * FROM table')
promise.then(function (somedata){renderPage(rows[0])};)
于 2013-10-10T19:03:25.950 に答える
0

このようなものは、おそらくあなたが探しているものです。クエリ コールバックで別の関数を呼び出します。

exports.getData = function() {                                                                   
  connection.query('SELECT * FROM table', function (error, rows, fields) {                                                                                    
    renderPage(rows[0]);                                                                               
  });                                                                                                                                                                       
}

function renderPage(data) {
    app.render('page', {
        "data": data
    }
}
于 2013-10-10T18:53:43.750 に答える