给出以下代码:
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。我也是编程新手。坦克你花时间读这个:)
答案 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文档,点击'查看代码'在连接示例的底部: