簡體   English   中英

Node.js,Express和Mysql。 正確的方法

[英]Node.js, Express and Mysql. How is correct way

我想要實現的是使數據庫查詢在閉包內部。 返回數據,然后將內容發送給用戶。 我了解最佳實踐是使用數據庫池。 問題是查詢不同步。

簡化代碼:

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;

在示例中,我發現所有與DB相關的東西都是在路由回調中完成的,響應是在查詢回調中發送的。 但是我嘗試做的方式不起作用,因為myquery返回undefined,因為那里的sql查詢還沒有完成。

那么處理查詢的正確方法是什么?

使您的查詢函數也處理回調:

// 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參數,因為似乎沒有使用它)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM