在NodeJS的所有请求中包含我的连接是否可以?

时间:2017-10-04 15:27:07

标签: javascript node.js express

我有3个文件。 db.jsapp.jscommentController.js。 我在我的应用程序中的每个请求中包含我的连接,以便我不会一次又一次地重复代码连接。这是一种不好/不安全的做法吗?有没有更好/更合适的方法来实现这个?

db.js

const mysql = require('mysql');

const pool = mysql.createPool({
    host     : 'host',
    user     : 'user',
    password : 'password',
    database : 'dbname'
});

exports.pool = pool;

app.js

const db = require('./db');

app.use((req, res, next) => {
  req.pool = db.pool;
  next();
});

commentController.js

exports.showComments = (req, res) => {
  req.pool.getConnection((err, conn) => {
    conn.query(`SELECT * FROM comments`, (err, results, fields) => {
      conn.release();
      if (err) throw err;

      res.render('comments', { results });
    });
  });
};

1 个答案:

答案 0 :(得分:3)

如果您这样做的唯一原因是为了避免重复代码,那么我认为这是一个坏主意。看着你的代码的人(或者你在一年内查看你的代码)并不自然地期望数据库连接是req的属性。你并没有真正省去任何麻烦。

只需require()文件中的数据库池并使用它。

<强> commentController.js

const db = require('./db');

require()会将同一个池返回给您的所有模块。

还不清楚为什么要请求连接而不是使用池(我对你正在使用的lib做了一些假设)。

通常你应该能够:

const db = require('./db');

exports.showComments = (req, res) => {
    db.query(`SELECT * FROM comments`, (error, results, fields) => {
        if (err) throw err;
        res.render('comments', { results });
    });
});

这样可以省去请求和返回连接的麻烦,只需让池可以正常工作。