2012-12-16 7 views
1

js와 노드에보다 익숙해 지도록 node.js에 reddit API wrapper를 구축하고 있습니다.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 : 여기에 지금까지 내 코드는

[[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) 

I :

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

나는이 오류 원래 로그인 기능이 다음과 같이 정의되었습니다.

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

하지만 이는 작동하지 않습니다. 또 다른 질문은 내가 지금 가지고있는 것처럼 그것을 포맷하는 것을 권장했지만 여전히 그것을 인식하지 못합니다.

+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 연산자가 필요합니다. 이 함수를 호출하고 (익명) 클래스의 객체를 생성하는

함수를 호출하는 것이 좋습니다. 나머지 코드는 그대로 작동해야합니다!

관련 문제