2012-12-16 89 views
1

我在node.js中構建了一個reddit API包裝,以便更熟悉js和node。這是我到目前爲止的代碼:nodejs無法識別對象的功能

./lib/reddit.js:

var request = require("request"); 

var reddit = function() { 

    var self = this, 
    userAgent = "node.js api wrapper", 
    debug = false, 
    uh = "", 
    cookie = ""; 

    self.getJSON = function (url, callback) { 
    request(url, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     callback(body); 
     } 
    }); 
    }; 

    self.post = function (url, data, callback) { 
    request.post(url, { form: data }, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     callback(body); 
     } 
    }); 
    }; 

}; 

reddit.prototype = { 

    login: function (username, password) { 
    var data = { 
     "user": username, 
     "password": password, 
     "rem": true 
    }; 

    this.post("http://www.reddit.com/api/login", data, function (body) { 
     var response = JSON.parse(body); 
     this.uh = response.json.data.modhash; 
     this.cookie = response.json.data.cookie; 
     console.log(response); 
     console.log(this.uh); 
     console.log(this.cookie); 
    }); 
    } 

} 

exports.reddit = reddit; 

app.js:

var reddit = require("./lib.reddit").reddit; 
reddit.login("username", "password"); 

我得到這個錯誤:

[[email protected] reddit]$ node app.js 

/home/jet/projects/reddit/app.js:5 
reddit.login("username", "password"); 
^
TypeError: Object function() { 

    var self = this, 
     userAgent = "node.js api wrapper", 
     debug = false, 
     uh = "", 
     cookie = ""; 

    self.getJSON = function (url, callback) { 
    request(url, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     callback(body); 
     } 
    }); 
    }; 

    self.post = function (url, data, callback) { 
    request.post(url, { form: data }, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     callback(body); 
     } 
    }); 
    }; 

} has no method 'login' 
at Object.<anonymous> (/home/jet/projects/reddit/app.js:5:8) 
at Module._compile (module.js:449:26) 
at Object.Module._extensions..js (module.js:467:10) 
at Module.load (module.js:356:32) 
at Function.Module._load (module.js:312:12) 
at Module.runMain (module.js:492:10) 
at process.startup.processNextTick.process._tickCallback (node.js:244:9) 

我最初有登錄功能定義如

reddit.prototype.login = function() ..... 

但這也不起作用。另一個SO問題建議格式化,就像我現在擁有它,但它仍然不認識它。

+0

我覺得這很簡單。如果您將此添加爲答案,我會爲您接受。 – gwely

+0

很高興我幫你。 –

回答

3
var reddit = require("./lib.reddit").reddit; 

var a = new reddit(); 

a.login("username", "password"); 
+0

你幾乎擊敗了其他人!感謝大家! – gwely

0

改變了我對這個問題的看法。並不是保留get,而是試圖在一個沒有通過混合兩種對象定義樣式(作爲函數和原型)實例化的函數中運行方法。 self.post不會存在,直到你真正實例化一個reddit對象。

我認爲最好的辦法是,要麼你self.post函數定義移動到一個原型,所以你可以使用它作爲一個靜態方法,或函數定義內移動登錄功能的定義和實際實例化對象使用它的'方法。

0

此構造:

var reddit = function() { }; 

僅僅是定義一個函數,不是類。您需要運算符new來調用它並創建一個對象。您可能想要使用:

var reddit = new function() { }; 

它調用函數並創建您的(匿名)類的對象。其餘的代碼應該可以正常工作!