我有一个文件(db_slave.js),看起来像这样:
var mysql = require('mysql')
var db = require('./db')
var conn = mysql.createConnection({
host: db.host,
user: db.user,
password: db.password
});
conn.connect(function (err) {
if (err) throw err;
console.log("Connected to db");
});
module.exports = conn;
所以我希望我的一个文件与数据库建立永久连接,因为许多其他文件将请求该文件执行查询。我的问题是,当其他文件调用该文件时,该文件会建立新的数据库连接还是仅保留一个conn变量?
其他文件将这样称呼该文件:
var sql = require('./db_slave')
sql.query("select 2", function (err, result) {
if (err) console.log(err)
console.log(result)
});
那么有多个DB_slave实例或多个连接吗?
有更好的方法吗?
答案 0 :(得分:0)
应该没问题。在db_slave的第一个require
之后,将来的需求将使用缓存的版本,而不重新运行模块代码。有关更多信息,请参见this answer。
答案 1 :(得分:0)
NodeJS是一个析因环境,因此,仅在他的第一个require调用时执行模块的代码。所有其他调用都使用第一次执行的结果,即导出的对象。因此,在您的代码中,相同的连接将在您需要此模块的所有地方使用。
答案 2 :(得分:-1)
node.js中的模块被缓存。因此,第一次插入require()
时,将加载它们并运行模块中的初始化代码。分配给module.exports
的所有内容都会被缓存,随后再次插入模块require()
时,只会从模块缓存中获取导出对象,并且不会再次运行您的模块代码。因此,这将适用于创建和共享一个数据库连接。
此设计存在一些问题,使其无法在现实世界中正常工作。
如果在创建与数据库的连接时出错,则无法将该错误传达回数据库的任何用户(以进行某些智能操作)。
调用方无法知道何时可以使用连接(connect
事件仅在内部)。
在现代的node.js中,可能更有意义的是导出一个诺言,该诺言在连接成功时进行解析,并在出现连接错误时拒绝,然后每次有人在该模块中要求时,他们都可以访问该诺言。他们可以使用.then()
获取数据库连接,并使用.catch()
获取错误。
例如:
var mysql = require('mysql-promise')
var db = require('./db')
module.exports = mysql.createConnection({
host: db.host,
user: db.user,
password: db.password
}).then(conn => {
console.log("connected to the DB");
return conn;
}).catch(err => {
console.log("error connecting to the DB", err);
throw err;
});
用法:
require('./db_slave').then(conn => {
return conn.query("select 2").then(result => {
console.log(result);
});
}).catch(err => {
// handle error here
});