Другая ошибка CoffeeScript - PullRequest
       11

Другая ошибка CoffeeScript

1 голос
/ 26 февраля 2011

Эй, я только изучаю 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

1 Ответ

8 голосов
/ 26 февраля 2011

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

Конструкция 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)
* 1017определение свойств экземпляра.(Для статических свойств @a = b и @a: b эквивалентны; оба значения UserDataProvider.a равны b.)
...