我创建了一个Mongoose连接管理器来管理我的应用程序中每个用户的唯一连接。在用户登录时,我创建了一个与该用户唯一的自定义数据库URI的新连接。我命名连接,以便以后可以检索(查找)。示例调用:
var myConnection = require('connection-manager').createConnection(user._id);
正如您在此处所见,我在用户对象的_id属性之后命名我的连接。很容易。然后,我可以使用以下方式查找此用户的唯一连接:
var myConnection = require('connection-manager').getConnection(user._id);
这两个方法之间的唯一区别是,一个创建并返回新连接,另一个(getConnection()方法)在当前连接池中进行简单查找,并返回与我们传递的名称匹配的连接对象(user._id)。
这是我遇到问题的地方。在我的服务器控制器中,我通常会这样做:
var mongoose = require('mongoose'),
Foo = mongoose.model('Foo');
这非常直截了当。我正在加载已经使用默认的Mongoose连接注册的模型'Foo'。这很方便,因为我的控制器的所有方法都可以通过执行以下操作来简单地调用此模型:
exports.create = function(req, res, next) {
myFoo = new Foo({whatever: whatever});
};
这是有效的,因为在文件的开头声明并加载了Foo。但是现在我正在转向连接管理器,我需要能够在我的控制器文件中执行类似的操作:
'use strict';
var manager = require('connection-manager').getConnection(user._id),
Foo = manager.model('Foo');
exports.create = function(req, res, next) {
var myFoo = new Foo({whatever: whatever});
};
问题是传递给exports.create()的请求对象是我需要的user._id,以便在连接管理器中查找我的自定义连接。我该如何解决这个问题..?
答案 0 :(得分:1)
在您的问题中,获取create方法连接的代码仅在您第一次需要该文件时运行一次。这就是为什么在那时使用userid没有意义,因为此时没有用户,服务器甚至可能在那时不接受请求。相反,您需要在每个请求上获取连接,这意味着在create方法中。
'use strict';
var manager = require('connection-manager');
exports.create = function(req, res, next) {
var connection = manager.getConnection(req.user._id),
Foo = connection.model('Foo'),
myFoo = new Foo({whatever: whatever});
};
答案 1 :(得分:0)
在上面的代码中:
app.route('/someroute').post(foo.create);
它将请求直接传递给foo.create,这对初学者来说有点混乱,它的真正含义是:
app.post('/someroute', function(req, res, next) {
//get your data here
//user = req.user_id;
foo.create(req, res, next);
});
我的建议是,不要先使用MEAN堆栈,创建一个简单的快速应用程序并弄清楚路由是如何工作的。
使用 express.Router() 代替 app.route 。
感谢。