无法使用非Mongoose对象中的Mongoose对象方法

时间:2016-02-18 22:24:18

标签: javascript node.js mongodb express mongoose

假设我们有一个Mongoose对象Foo.js

var mongoose = require('mongoose');

var Bar = require('/path/to/bar');

var Foo = mongoose.Schema({});

Foo.statics.hello = function() {
  console.log('hello from foo');
};

Foo.statics.useBar = function() {
  Bar.hello();
};

module.exports = mongoose.model('Foo', Foo);

以及常规的javascript对象Bar.js

var Foo = require('/path/to/foo');

var Bar = function() {};

Bar.hello = function() {
  console.log('hello from bar');
};

Bar.useFoo = function() {
  Foo.hello();
};


module.exports = Bar;

如果我们想从Bar调用Foo中的方法,一切都会好的。但是,如果我们想从Foo调用Bar中的方法,我们就会收到错误。

app.use('/test', function(req, res, next) {

  var Foo = require('/path/to/foo');
  var Bar = require('/path/to/bar');

  Foo.hello();
  Bar.hello();

  Foo.useBar();
  Bar.useFoo();

});

以上产量:

hello from foo
hello from bar
hello from bar
TypeError: Foo.hello is not a function

为什么会这样?

此外,如何创建一个可以从Bar调用方法的对象Foo,但同时并不意味着 - 并且不能 - 持久存储到mongodb中?

1 个答案:

答案 0 :(得分:2)

您遇到的问题是node.js中的循环/循环依赖项。它会给你一个空对象。

如果您更改var Bar = function() {}; module.exports = Bar; var Foo = require('/path/to/foo'); Bar.hello = function() { console.log('hello from bar'); }; Bar.useFoo = function() { Foo.hello(); }; ,请执行以下操作:

var Bar = require('/path/to/bar');
var Foo = require('/path/to/foo');

然后将app.use中的订单交换为

<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
   ---EDIT---
   <LinearLayout
        android:id="@+id/main_frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"/>
   ---EDIT---
    <EditText
        android:id="@+id/search_address"
        android:drawableLeft="@drawable/action_search"
        android:gravity="top"
        android:background="#2a2dc7"
        android:backgroundTint="@color/colorPrimary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"/>

    <CheckBox
        android:text="Show Risk"
        android:id="@+id/show_risk_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|bottom"
        android:layout_marginBottom="80dp"
        android:layout_marginRight="80dp"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>

    <Button
        android:id="@+id/btn_zoom_in"
        android:text="+"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"/>

    <Button
        android:id="@+id/btn_zoom_out"
        android:text="-"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="95dp"
        android:layout_gravity="bottom|right"/>
    <Button
        android:id="@+id/btn_current_location"
        android:text="Location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"/>
</FrameLayout>


</android.support.v4.widget.DrawerLayout>

它对我有用。

请查看此答案以获取更多信息:How to deal with cyclic dependencies in Node.js