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 层被分离。你有什么主意吗 ?

此外,如果有人知道使用 node-mysql 而不是 ORM 的优缺点(续集,persistence.js ...)

谢谢

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 回答
-2

此代码用于检查您是否在 DB 中有任何单行

if(result.length == 1) {
    var row = result[0];
    console.log(row);
}
于 2021-06-10T10:55:03.197 回答