3

假设我有一个应用程序:

./app.coffee:

express = require "express"
module.exports = app = express()
require "./models"

./models/index.coffee

app = require "../app"

然后我运行命令:coffee app.coffee

问题是代码的运行方式与预编译时不同。

node当我使用(已编译)运行我的应用程序时:

  • app.coffee要求_models
  • models需要app并返回module.exports(app)

当我运行我的应用程序时coffee

  • app.coffee要求_models
  • models需要app但应用程序再次运行并再次需要模型

运行我的应用程序时,module.exports 似乎无法正常工作coffee。或者也许我做错了什么?

4

1 回答 1

1

Node 具有用于管理模块周期coffee的更改行为,在使用可执行文件时似乎不受支持:

当存在循环require()调用时,模块可能在返回时尚未执行完毕。

[...]

main.js加载时,a.js然后a.js依次加载b.js。此时,b.js尝试加载a.js. 为了防止无限循环,将导出对象的未完成副本a.js返回给b.js模块。b.js然后完成加载,并将其导出对象提供给a.js模块。

如果可以的话,尽量避免循环。一种可能的选择是:

express = require "express"
module.exports = app = express()
models = require "./models"
models app
module.exports = (app) ->
  # ...
于 2013-01-07T02:11:15.913 回答