2013-04-28 1 views
4

Я обнаруживаю Nodejs и модуль 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 был отделен. У вас есть идеи?

Кроме того, если кто-то имеет представление о том, плюсы/минусы использования узла MySQL вместо ОРМ (sequelize, persistence.js ...)

Благодарности

ответ

14

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 (мой любимый для MySQL patio), если моему приложению нужны несколько (сложных) моделей, возможно, с ассоциациями между ними. Кроме того, абстракция ORM обеспечивает упрощение чтения кода и, как правило, позволяет легко переносить приложение в другую базу данных.

+1

Спасибо, что сделал работу :). Я лучше понимаю концепцию асинхронных функций. Что касается ORM, я пришел из PHP и Java, с теми языками, которые я, естественно, использовал бы ORM, но все кажется «особенным» с Node.js. Я попробовал Sequelize и есть много недостающих функций (например, ограничения на внешние ключи) – c4k