6

Nodejs と node-mysql モジュールを発見しています。小さな問題があります。私が見つけたすべてのチュートリアルは、データベースで選択を行う方法を説明していますが、行を返すことはなく、常にログに記録するため、私の場合はまったく役に立ちません。

私は app.js ファイルを持っています:

// Get continents
app.get("/continents", function(request, result) {
    console.log("Continents : " + database.findAllContinents());
});

そして mysql.js ファイル:

exports.findAllContinents = function(connection) {
    var connection = getConnection();
    connection.query('select id, code, name from Continent', function (err, rows, fields) {
        if (err) {
            console.log("Error in findAllContinents : " + err)
        }
        return JSON.stringify(rows);
    });
    closeConnection(connection);
};

関数が行を返して app.js ファイルで使用するようにするにはどうすればよいですか? app.js ファイルで接続を作成したくありません。DAO レイヤーを分離したいのです。何か考えはありますか?

また、ORM (sequelize、persistence.js...) の代わりに node-mysql を使用することの長所/短所について誰かが考えている場合

ありがとう

4

2 に答える 2

16

query()結果を返すことができない非同期関数です。その結果、非同期関数自体を呼び出す関数 (あなたの などfindAllContinents) もできません。

代わりに、クエリが完了したときに呼び出される コールバック関数 (こちらでも説明されています) を渡す必要があります。

// app.js
app.get("/continents", function(request, response) {
  database.findAllContinents(function(err, results) {
    if (err)
      throw err; // or return an error message, or something
    else
      res.send(results); // as a demo, we'll send back the results to the client;
                         // if you pass an object to 'res.send()', it will send
                         // a JSON-response.
  });
});

// mysql.js
exports.findAllContinents = function(cb) {
  var connection = getConnection();
  connection.query('select id, code, name from Continent', function (err, rows, fields) {
    // close connection first
    closeConnection(connection);
    // done: call callback with results
    cb(err, rows);
  });
};

ORM を使用する (しない) ことに関しては、ユースケースによって異なります。アプリで複数の (複雑な) モデルが必要な場合に備えて、ORM を選択します (MySQL でのお気に入りはパティオです)。また、ORM が提供する抽象化により、コードが読みやすくなり、通常はアプリを別のデータベースに簡単に移植できます。

于 2013-04-28T15:12:53.680 に答える