gpt4 book ai didi

node.js - 使用全局变量在模块之间共享数据库

转载 作者:IT老高 更新时间:2023-10-28 23:20:45 28 4
gpt4 key购买 nike

我正在使用“mongodb”模块开发 nodejs/mongodb 应用程序。该应用程序启动与

node main.js

在 main.js 中,我连接到 db 并将连接保持在“db”全局变量中。然后在“服务器”的内部方法中使用“db”。我想避免将 'db' 作为全局变量,但没有找到正确的方法。

我当前的 main.js:

var server      = require('./lib/server');
var MongoClient = require('mongodb').MongoClient;
var Server = require('mongodb').Server;
var mongoClient = new MongoClient(new Server(HOST, PORT));
db = null;

// Database connection
mongoClient.open(function(err, mongoClient) {
if(!err){
// Database selection
db = mongoClient.db(DB);

// Launch web server
server.start(); // usage of 'db' in this part

} else {
console.log(err.message);
process.exit(1);
}
});

有什么更清洁的方法吗?

更新

我终于在connection.js中创建了一个模块:

var config      = require('../config/config');
var url = 'mongodb://' + config.db.host + ':' + config.db.port + '/' + config.db.name;
var MongoClient = require('mongodb').MongoClient;
var db = null;

module.exports = function(cb){
if(db){
cb(db);
return;
}

MongoClient.connect(url, function(err, conn) {
if(err){
console.log(err.message);
throw new Error(err);
} else {
db = conn;
cb(db);
}
});
}

每次我需要获得我调用的连接时:

var connection = require('./connection');
connection(function(db){
// doing some stuff with the db
});

这工作得很好。

这种方法有什么潜在的失败吗?

最佳答案

我通常会包含一个项目实用程序文件,其中包含许多此类内容,只是为了方便。它作为一个伪全局函数起作用,但没有全局变量带来的许多常见问题。

例如,

projectUtils.js

module.exports = {

initialize: function(next){
// initialization actions, there can be many of these
this.initializeDB(next);
},

initializeDb: function(next){
mongoClient.open(function(err, mongoClient) {
if(err) return next(err);
module.exports.db = mongoClient.db(DB);
next();
});
}
}

app.js

var projectUtils = require('projectUtils');

// (snip)
projectUtils.initialize(function(err) {
if(err) throw err; // bad DB initialization
// After this point and inside any of your routes,
// projectUtils.db is available for use.
app.listen(port);
}

通过使用异步 initialize() 函数,您可以确保在启动服务器之前完成所有数据库连接、文件 I/O 等。

关于node.js - 使用全局变量在模块之间共享数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005379/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com