为什么mongoose.connect()在作为猫鼬对象的方法不存在时工作得很好?

时间:2016-04-02 14:45:13

标签: javascript node.js mongodb express

给出以下代码:

var mongoose = require("mongoose");
console.log(mongoose);

mongoose.connect("my database url here")

如何一切正常 - 但是猫鼬对象没有附加任何connect()方法?这是console.log打印:

Mongoose {
      connections: 
       [ NativeConnection {
           base: [Circular],
           collections: {},
           models: {},
           config: [Object],
           replica: false,
           hosts: null,
           host: null,
           port: null,
           user: null,
           pass: null,
           name: null,
           options: null,
           otherDbs: [],
           _readyState: 0,
           _closeCalled: false,
           _hasOpened: false,
           _listening: false } ],
      plugins: [],
      models: {},
      modelSchemas: {},
      options: { pluralization: true } }

不要误会我的意思,我喜欢神奇的东西 - 但不是当我试图深入理解整个平均堆栈如何组合在一起时。这次我没有错误的事实并没有帮助我。 我所知道的 - 它应该是这样的:

var myObj = {
    someMethodLikeConnect: function(nonBoringParameter){
      //and now this is a method.
    }
}
console.log(myObj); // it prints corectly
myObj.someMethodLikeConnect("foo"); // this works and it's expected.
myObj.connect("some URL"); // this gives: "myObj.connect is not a function" Error and it's also expected.

是否有类似原型继承的事情?我的意思是这个connect()方法不存在于mongoose对象上,而是形成另一个更高级别的东西(由节点上下文或smth构建 - 因为某些节点如何识别我们正在使用“mongoose”模块而不是“myObj”? ) - >这就是为什么我的控制台没有记录它? 或者我是否从根本上忽略了JavaScript的工作方式?

这是一个nodejs应用程序 - 我使用Cloud9。我也是编程新手。坦克你花时间读这个:)

1 个答案:

答案 0 :(得分:1)

你的预感是正确的,这里有原型继承。

以下是connect方法的代码:

Mongoose.prototype.connect = function() {
  var conn = this.connection;
  if (rgxReplSet.test(arguments[0]) || checkReplicaSetInUri(arguments[0])) {
    return new MongooseThenable(this, conn.openSet.apply(conn, arguments));
  }

  return new MongooseThenable(this, conn.open.apply(conn, arguments));
};
Mongoose.prototype.connect.$hasSideEffects = true;

当你单独记录Mongoose对象时,它只会在那个对象内部有什么,而不是它的原型。

现在,如果你实例化一个新的Mongoose对象并记录下来?它将具有相关功能。

看看我制作的这个快速的JSBin,看看到底是什么意思:JSBIN LINK

请注意这里的Mongoose文档,点击'查看代码'在连接示例的底部:

Relevant Docs