2012-05-27 2 views
6

У меня возникли проблемы с попыткой заставить мой класс работать в моем файле node.js. Когда мне нужен модуль, который я написал, require './module' вызывает мой конструктор и дает ошибку. Но я действительно хочу создать экземпляр позже в файле.Путаница Coffeescript и node.js. требуется класс экземпляров?

т.е.

class Mic 

constructor: (x) -> 
    @t = [] 
    @t.push x 

exports.Mic = Mic 

, а вот мой app.coffee файл

require 'coffee-script' 
require './Mic' 

Когда я бег app.coffee это дает ReferenceError исключения: й не определен. Что имеет смысл с момента вызова конструктора, но почему он вызывает конструктор, хотя я не называл новый Mic?

Редактировать После установки отступов

class Mic 
    constructor: (x) -> 
     @t = [] 
     @t.push x 

exports.Mic = Mic 

и обновление моего app.coffee к

Mic = require './Mic' 

m = new Mic 3 
console.log m 

Я получаю ошибку

TypeError: object is not a function 
    at Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR (native) 

ответ

17

первое Первое: вы дон Не нужно require 'coffee-script' - хватит его coffee; аналогично запуску скомпилированного JavaScript. Вам не нужна библиотека CoffeeScript, доступная во время выполнения вашей программы.

Во-вторых, первый файл имеет неправильный отступ; если вы хотите, чтобы быть Mic «s конструктора, отступ на один уровень под class, т.е .:

class Mic 
    constructor: (x) -> 
    @t = [] 
    @t.push x 

exports.Mic = Mic 

Наконец, вопрос заключается в том, что exports является объекта экспорта. Смотрите здесь:

exports.Mic = Mic 

Вы назначенную Mic для Mic ключа exports объекта, так что теперь exports в Mic.coffee выглядит следующим образом:

{ Mic: ...your class... } 

Когда вы говорите require './Mic', вы получаете, что объект назад; другими словами:

require('./Mic') == { Mic: ...your class... } 

Так что вам нужно сделать одно из следующих действий:

  1. Экспорт Mic как весь экспорт Mic.кофе, а не в качестве ключа:

    module.exports = Mic 
    
  2. Получить весь модуль, и затем создать экземпляр Mic объекта внутри:

    mic = require './Mic' 
    m = new mic.Mic 3 
    
  3. Просто Mic из require «й модуль:

    {Mic} = require './Mic' # equivalent to saying Mic = require('./Mic').Mic 
    m = new Mic 3 
    
+0

Эй, ой, я забыл заменить блюдо ш с микрофоном. Это была проблема с копией и вставкой. Я отступил от своего кода, и теперь я получаю объект TypeError: объект не является функцией объекта Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR. Код не создается автоматически до тех пор, пока я не назову mic = new Mic 3, а затем выдаст предыдущую ошибку. –

+0

Соответственно отредактирован ответ. – Ashe

+0

А вот идем. Спасибо, это помогло! –