【问题标题】:MEAN.JS -- Request objects, Express controllers, and Mongoose SchemasMEAN.JS -- 请求对象、Express 控制器和 Mongoose 模式
【发布时间】:2015-04-15 02:24:28
【问题描述】:

我创建了一个 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 所在的位置,我需要在连接管理器中查找我的自定义连接。我该如何解决这个问题..?

【问题讨论】:

  • “但是如果我想在 create() 之外访问那个请求对象怎么办?” 请给我们一个例子,因为这没有任何意义。在 create() 之外访问它不会太有用..
  • 我完全重写了我的帖子以更具体。如果这没有意义,请告诉我,我会尽我所能澄清:) 感谢您的耐心。
  • 您需要在每个请求上“获取”连接。在为特定用户创建之外获取连接没有意义,因为使用此应用的多个用户将同时使用同一个文件。
  • 你能再具体一点吗?我正在考虑使用中间件来处理它,但我仍然不确定它是如何工作的。
  • 在评论中有点难以解释,我会发布一个答案。

标签: javascript node.js express mongoose mean-stack


【解决方案1】:

在您上面的代码中:

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

谢谢。

【讨论】:

  • 感谢您的回复,但不幸的是,它不适用于我更新的帖子。我完全重写它以澄清我的问题 - 我希望我能更快,这样你就不会浪费你的时间:(
【解决方案2】:

您在问题中获得创建方法连接的代码仅在您第一次需要该文件时运行一次。这就是为什么此时使用用户 ID 没有意义,因为此时没有用户,服务器可能甚至不接受请求。相反,您需要获取每个请求的连接,也就是说,在 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});
};

【讨论】:

  • 哈!有趣的是,这就是我目前所拥有的。但这对我来说真的很糟糕,因为现在我必须执行 getConnection() 并将模型加载到属于我的控制器的每个方法上。我以前只做一次,现在我必须在很多地方做。
  • 好吧,如果您愿意,您可以在管理器中预先完成所有这些操作,并将模型集合存储在返回的连接上,尽管这很难维护。
  • 我也想过这个问题。我想我会暂时放下它。十分感谢你的帮助。我真的很感激。
猜你喜欢
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2020-11-09
  • 2014-07-29
  • 2018-08-10
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多