2012-09-07 18 views
19

Sto lavorando ad un semplice esempio; Posso farlo funzionare con Javascript, ma c'è qualcosa di sbagliato nella mia versione di CoffeeScript.Node.js module.exports in CoffeeScript

Ecco person.coffee:

module.exports = Person 

class Person 
    constructor: (@name) -> 

    talk: -> 
     console.log "My name is #{@name}" 

Ed ecco index.coffee:

Person = require "./person" 
emma = new Person "Emma" 
emma.talk() 

mi aspetto di correre index.coffee e vedere l'output della console "Il mio nome è Emma" . Invece, sto ricevendo un errore che dice TypeError: indefinito in non una funzione.

risposta

26

Inserire la riga module.exports nella parte inferiore.

---- ---- person.coffee

class Person 
    constructor: (@name) -> 

    talk: -> 
     console.log "My name is #{@name}" 

module.exports = Person 

Person = require "./person" // [Function: Person] 
p = new Person "Emma" // { name: 'Emma' } 

Quando si assegna al module.exports in alto, la variabile Person è ancora undefined.

+0

Questo è tutto! Molte grazie. –

+0

fyi: per capire perché potrebbe essere utile guardare il modello tradizionale in javascript per creare i moduli – froginvasion

15

Si potrebbe anche scrivere in person.coffee:

class @Person 

quindi utilizzare i seguenti in index.coffee:

{Person} = require './person' 
+0

Provato questo e continuando a ottenere l'errore 'object is not a function'. – majidarif

+0

@majidarif Dai un'occhiata al tuo codice compilato per verificare che abbia senso. Stai utilizzando un ambiente o un browser Node.js? – vaughan

+0

In realtà sono su Node.js, ho 2 classi su 1 file e 2 classi che estendono una e una di quelle classi. Quindi il sottotitolo è quello che dovevo esportare. – majidarif

5

Si potrebbe anche scrivere

module.exports = class Person 
    constructor: (@name) -> 
    console.log "#{@name} is a person" 

poi nel index.coffee sia

bob = new require './person' 'Bob' 

o si potrebbe fare in questo modo

Person = require './person' 
bob = new Person 'bob' 
2

Le varie risposte qui sembra dare per scontato che l'unico oggetto esportato dal modulo è la classe (tipo di "via Java di pensare")

Se avete bisogno di esportare diversi oggetti (classi, funzioni, ecc), si dovrebbe probabilmente essere meglio scrivere:

exports.Person = class Person 
    [...] 


coffee> { Person } = require "./person" 
coffee> p = new Person "Emma" 
Problemi correlati