2011-02-26 31 views
1

嘿,我只是學習CoffeeScript和我不斷收到錯誤。這裏是我的代碼:另一個CoffeeScript錯誤

Db = require('./lib/mongodb').Db 
ObjectID = require('./lib/mongodb').ObjectID 
Server = require('./lib/mongodb').Server 

class UserDataProvider 
    constructor = (host,port)-> 
     this.db = new Db('test' , new Server(host ,port,{})) 
    getCollection = (callback) -> 
     this.db.collection 'data',(error,data)-> 
      if error then callback(error) 
      else callback(data) 
    findAll = (callback) -> 
     this.getCollection (error,data)-> 
      if error then callback error 
      else 
       data.find (error, cursor) -> 
        if error then callback error 
        else 
         cursor.toArray (error, results)-> 
          if error then callback error 
          else callback(null,results) 
    findById = (id,callback)-> 
     this.getCollection (error, data)-> 
      if error then callback error 
      else 
      data.findOne { _id: id} , (error, result)-> 
       if error then callback error 
       else callback(null, result) 
    save = (data, callback)-> 
     this.getCollection (error, collection)-> 
      if error then callback error 
      else 
       if typeof(data.length) is "undefined" 
       then data = [data] 

       collection.insert data()-> 
        callback null, data 

exports.UserDataProvider = UserDataProvider 

當我嘗試使用 userdataprovider.save(?? BLAH BLAH BLAH?)//我已經實例化它。

我得到這個錯誤:

TypeError: Object #<UserDataProvider> has no method 'save' 
    at Object.<anonymous> (/home/akshay/dev/statServer/app.js:8:15) 
    at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21) 
    at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:157:15) 
    at pass (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:162:10) 
    at Object.router [as handle] (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:168:6) 
    at next (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/index.js:218:15) 
    at Object.handle (/usr/local/lib/node/.npm/express/1.0.7/package/lib/express/server.js:65:5) 
    at next (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/index.js:218:15) 
    at Server.handle (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/index.js:231:3) 
    at Server.emit (events.js:45:17) 

如果它的事項,我使用Expressjs並用的NodeJS本地的MongoDB驅動

回答

8

的問題是,你正在使用的不是=:定義實例 - 級別的方法。

CoffeeScript的class構造是一個奇怪的對象和函數混合。班級內的代碼立即運行 - 例如,

class UserDataProvider 
    a = 'foo' 
    console.log a 

打印foo。但是,當你使用對象語法key: value,定義原型的屬性(除特殊關鍵字constructor的情況下):

class UserDataProvider 
    a: 'foo' 

(new UserDataProvider).a # 'foo' 

這聽起來很奇怪,但它允許您運行一次性靜態初始化代碼可以是有用的,包括私有變量只能由類中定義的方法可以看出:

class UserDataProvider 
    secretPassword = Math.random() 
    getHash: -> hash(secretPassword) 

長話短說:定義實例屬性時,請使用:而不是=。 (對於靜態屬性,@a = b@a: b是等效的;都設置爲UserDataProvider.ab。)

+0

太棒了,我不知道。我無法在文檔中找到它。非常感謝。文檔是否落後於代碼? – akshaykarthik 2011-02-26 03:34:02

+0

是的,文檔中的所有示例都使用':';整個「班級機構立即運行」的事情是相當新的(1.0之前不久推出)。它並沒有過時,但是在簡要概述和涵蓋所有內容之間有一個平衡點,你知道嗎?我發現「可執行類體」是[FAQ](https://github.com/jashkenas/coffee-script/wiki/FAQ)上的TODO。 – 2011-02-26 03:44:13