返回带有nodejs和node-mysql的行

时间:2013-04-28 14:59:01

标签: node.js select node-mysql

我正在发现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(sequelize,persistence.js ......)的优点/缺点

由于

2 个答案:

答案 0 :(得分:15)

query()是一个异步函数,您无法从中返回任何结果。因此,任何调用异步函数的函数(如findAllContinents)都不能。

相反,您需要传递一个回调函数(也解释为here),它将在查询完成时调用:

// 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是patio)。此外,ORM提供的抽象使代码更易于阅读,并且通常允许更轻松地将应用程序移植到不同的数据库。

答案 1 :(得分:-2)

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

if(result.length == 1) {
    var row = result[0];
    console.log(row);
}