2012-05-27 9 views
6

Tengo problemas para hacer que mi clase trabaje en mi archivo node.js. Cuando requiero el módulo que escribí, require './module' llama a mi constructor y me da un error. Pero en realidad quiero crear una instancia más adelante en el archivo.confusión de Coffeescript y node.js. requiere instancias de clase?

es decir

class Mic 

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

exports.Mic = Mic 

y aquí está mi archivo app.coffee

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

Cuando corro app.coffee se da una excepción ReferenceError: x no está definido. Lo cual tiene sentido ya que llama al constructor, pero ¿por qué está llamando al constructor aunque no haya llamado al nuevo micrófono?

Editar Después de fijar la sangría

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

exports.Mic = Mic 

y actualizar mi app.coffee a

Mic = require './Mic' 

m = new Mic 3 
console.log m 

consigo el error

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

Respuesta

17

Lo primero es lo primero: Don No es necesario el require 'coffee-script': ejecutarlo con coffee es suficiente; lo mismo que ejecutar el JavaScript compilado. No necesita la biblioteca CoffeeScript disponible en tiempo de ejecución en su programa.

En segundo lugar, el primer archivo aparece sangrado incorrectamente; si quieres que para ser Mic 's constructor, una sangría que un nivel por debajo de la class, es decir .:

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

exports.Mic = Mic 

Por último, la cuestión es que exports es un objeto de las exportaciones. Ver aquí:

exports.Mic = Mic 

que ha asignado Mic a la clave del objeto exportsMic, por lo que ahora exports en Mic.coffee se ve así:

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

Cuando dice require './Mic', que está recibiendo esa objeto atrás; en otras palabras:

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

Así que hay que hacer una de las siguientes:

  1. exportación Mic como toda la exportación de Mic.café, y no como una clave:

    module.exports = Mic 
    
  2. Consigue todo el módulo, y luego una instancia del objeto Mic dentro:

    mic = require './Mic' 
    m = new mic.Mic 3 
    
  3. Basta con echar Mic a cabo desde el módulo require 'd:

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

Hey, perdón me olvidaba cambiar Dish w ith Mic. Fue un problema de copiar y pegar. He sangrado mi código y ahora obtengo un TypeError: objeto no es una función en Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR. El código no crea una instancia automática hasta que llamo mic = nuevo Mic 3 cuando luego se da el error anterior. –

+0

Respuesta actualizada en consecuencia. – Ashe

+0

Ah, ahí vamos. Gracias ese fue el truco! –

Cuestiones relacionadas