【问题标题】:NodeJS CoffeeScript external file scopeNodeJS CoffeeScript 外部文件范围
【发布时间】:2016-04-03 22:39:10
【问题描述】:

如何在一个文件 (a.coffee) 中定义一个函数,以便另一个文件 (b.coffee) 中的 NodeJS 模块可以使用它?

例如:

# a.coffee
b = require('./b')

getGreeting = (name) ->
  if name == "foo"
    "Hey, "
  else
    "Hello, "


b.greet "foo"



# b.coffee
module.exports =
  greet: (name) ->
    greeting = getGreeting name
    console.log greeting + name

使用coffee -bc *.coffee 编译并使用nodejs a.js 运行得到

ReferenceError: getGreeting is not defined
    at Object.module.exports.greet (/home/charlie/Desktop/NodeJSExtTest/b.js:5:16)
    at Object.<anonymous> (/home/charlie/Desktop/NodeJSExtTest/a.js:14:3)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:142:18)
    at node.js:939:3

我也尝试过使用@getGreeting,但结果相同。

额外信息:

$ coffee -v
CoffeeScript version 1.10.0

$ nodejs -v
v5.9.1

【问题讨论】:

  • b.coffee 没有引用 getGreeting
  • @eosterberg 我明白了,但是我怎么给 b 那个参考呢?目前,我正在使用:(eval b.greet.toString())("foo"),但这只是在寻找问题。

标签: node.js coffeescript


【解决方案1】:

您可以将getGreeting 注入到模块 b 中,例如如下:

b.coffee:

module.exports = (getGreeting) ->
  greet: (name) ->
    greeting = getGreeting name
    console.log greeting + name

一杯咖啡:

b = require('./b')(getGreeting)

【讨论】:

  • 如果函数getGreeting 需要更多来自a.coffee 的变量,这是否也可以工作?我想将我的主文件拆分成更小的文件,但它们都需要这些变量,而且它们一直在变化
  • 是的。模块 b 的代码 ((getGreeting) -&gt; greet: ...) 中的外部函数与模块 a 中的任何其他函数一样执行,并且 JavaScript 的正常范围规则适用于它可能作为参数接收的任何函数。因此,您可以在模块atitle = 'Mr. '; getGreeting = (name) -&gt; if name == 'foo' then 'Hey, ' + title else 'Hello, ' + title,然后是b = require('./b')(getGreeting)
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 2012-01-20
  • 2016-06-23
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多