MEAN.JS -- 请求对象、Express 控制器和 Mongoose 模式

MEAN.JS -- Request objects, Express controllers, and Mongoose Schemas

我已经创建了一个 Mongoose 连接管理器来管理我的应用程序中每个用户的唯一连接。在用户登录时,我创建了一个新连接到该用户唯一的自定义数据库 URI。我为连接命名,以便以后可以检索(查找)它。调用示例:

var myConnection = require('connection-manager').createConnection(user._id);

正如您在此处看到的,我以用户对象的 _id 属性 命名我的连接。很容易。然后我可以使用以下方法查找该用户的唯一连接:

var myConnection = require('connection-manager').getConnection(user._id);

这两种方法的唯一区别在于,一种方法创建并 returns 新连接,另一种方法(getConnection() 方法)在当前连接池中进行简单查找,然后 returns 与我们传递的名称匹配的连接对象 (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 的地方,以便在连接管理器中查找我的自定义连接。我该如何解决这个问题..?

在您上面的代码中:

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.

谢谢。

问题中为创建方法获取连接的代码仅运行一次,即您第一次需要该文件时。这就是为什么此时使用 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});
};