假设我们有一个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中?
答案 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