Ind*_*ial 5 javascript global global-variables node.js express
db使用我的路由器/控制器在下面的片段(变量)中共享数据库连接而不将db变量转换为全局变量的最合适方法是什么?
var mongo = require('mongoskin'),
db = mongo.db(config.db.adress);
app.use(function(req, res, next) {
db.open(function(err, data) {
(err) ? res.send('Internal server error', 500) : next();
});
});
// Setting up controllers here
app.post('/users', require('./controllers/users').create);
Run Code Online (Sandbox Code Playgroud)
来自PHP背景,我开始考虑依赖注入,但我不知道这是否适合于节点.
试试这种方式:
app.js:
var mongo = require('mongoskin'),
db = mongo.db(config.db.adress);
app.use(function(req, res, next) {
db.open(function(err, data) {
(err) ? res.send('Internal server error', 500) : next();
});
});
require('./controllers/users')(app, db);
Run Code Online (Sandbox Code Playgroud)
控制器/ users.js:
module.exports = function (app, db) {
app.post('/users', function(req, res, next) {
// Your create function
// Link to db exists here
});
};
Run Code Online (Sandbox Code Playgroud)
我对mongoskin没有任何经验,但Mongoose通过每次需要时返回一个Mongoose的Singleton实例来巧妙地回避这个问题.
这允许您创建一次连接(通常在app init上),并在需要时通过查询模型简单地使用它.
它还允许您像这样定义模型:
var mongoose = require('mongoose'),
TodoSchema = new mongoose.Schema({
title: { 'type': String, 'default': 'empty todo...' },
order: { 'type': Number },
done: { 'type': Boolean, 'default': false }
});
mongoose.model('Todo', TodoSchema);
Run Code Online (Sandbox Code Playgroud)
然后在需要的地方使用它们:
var mongoose = require('mongoose'),
Todo = mongoose.model('Todo');
Run Code Online (Sandbox Code Playgroud)
有关Mongoose如何工作的更多信息,可以在此答案中找到示例代码.
从mongoskin的文档来看,每次你想要使用它时都必须连接,你可以通过将db连接包装在一个你需要的文件中来简化:
db.js
exports.db = require('mongoskin').db('myProject-' + process.env.NODE_ENV);
Run Code Online (Sandbox Code Playgroud)
用它:
var db = require('./db');
db.open(function(err, data) {
(err) ? res.send('Internal server error', 500) : next();
});
Run Code Online (Sandbox Code Playgroud)
上面的方法,其中db作为参数传递给可能需要它的每个函数,导致回调汤,如果可能应该避免.
| 归档时间: |
|
| 查看次数: |
8741 次 |
| 最近记录: |