2016-04-02 2 views
0

Как определить функцию в одном файле (a.coffee), чтобы модуль NodeJS в другом файле (b.coffee) мог использовать его?Внешняя область NodeJS CoffeeScript

Например:

# 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 
+0

b.coffee не имеет никакого отношения к getGreeting – eosterberg

+0

@eosterberg Я понимаю, что, но как бы я дать Ъ, что Справка? На данный момент я делаю в: '(eval b.greet.toString()) (" foo ")', но это просто требует проблем. – Charlie

ответ

1

Вы можете вводить getGreeting в модуль б, например, следующим образом:

b.coffee:

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

a.coffee:

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

Будет ли это работать, если функция 'getGreeting' требует больше переменных из' a.coffee'? Я хочу разбить мой основной файл на более мелкие файлы, но все они нуждаются в этих переменных, и они продолжают меняться. – Charlie

+0

Да. Внешняя функция в коде модуля 'b' (' getGreeting) -> greet: ... ') выполняется как любая другая функция в модуле' a', а обычные правила видимости JavaScript применяются для любой функции, которую он может получить как аргумент. Таким образом, вы можете иметь что-то в этих строках в модуле 'a':' title = 'Mr. «; getGreeting = (name) -> if name == 'foo' then 'Hey,' + title else 'Hello,' + title', затем 'b = require ('./ b') (getGreeting)'. –

+0

Спасибо большое! Приму – Charlie

Смежные вопросы