Node.js,Express和Mysql。 如何正确的方式

我想要实现的是在闭包内进行数据库查询。 返回数据,然后发送给用户的东西。 我知道最好的做法是使用数据库池。 问题是查询不同步。

简化代码:

server.js

var express = require('express'), app = express(), server = require('http').createServer(app), mysql = require('mysql'); app.set('DB:pool', mysql.createPool(process.env.DATABASE_URL)); var myClosure = require('./closure.js')(app)); app.get('/somepage', function(req, res) { var data = myClosure.myquery(); res.send(data); }); app.get('/anotherpage', function(req, res) { var data = myClosure.myquery(); res.send(data); }); app.listen(3000); 

closure.js

 function myClosure(app) { var pool = app.get('DB:pool'); return { myquery: function(inp) { pool.getConnection(function(err, db) { if (err) throw err; db.query('SELECT * FROM table', function(err, rows, fields) { if (err) throw err; data = rows[0] db.release(); }); }); return data; } }; } module.exports = myClosure; 

在例子中,我发现所有的数据库相关的东西都在路由callback和响应发送查询callback。 但是,我试图做到这一点不工作,因为myquery返回未定义,因为SQL查询没有完成。

那么处理querys的正确方法是什么?

让你的查询函数也处理一个callback:

 // server.js app.get('/somepage', function(req, res) { myClosure.myquery(function(err, data) { // TODO: handle error... res.send(data); }); }); // closure.js ... myquery: function(callback) { pool.getConnection(function(err, db) { if (err) return callback(err); db.query('SELECT * FROM table', function(err, rows, fields) { // release connection before we return anything, otherwise it // won't be put back into the pool... db.release(); if (err) return callback(err); callback(null, rows[0]); }); }); } 

(我遗漏了inp论点,因为这似乎没有被使用)