1

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

简化代码:

服务器.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);

闭包.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;

在示例中,我发现所有与数据库相关的东西都是在路由回调中制作的,并且响应是在查询回调中发送的。但是我试图这样做的方式不起作用,因为 myquery 返回 undefined 因为 sql 查询没有在那里完成。

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

4

1 回答 1

7

让您的查询函数也处理回调:

// 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论点,因为它似乎没有被使用)

于 2013-10-07T18:25:53.920 回答