1

Node.js で reddit API ラッパーを作成して、js とノードに慣れようとしています。これまでの私のコードは次のとおりです。

./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");

次のエラーが表示されます。

[jet@cowboybebop 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 の質問では、現在のようにフォーマットすることをお勧めしましたが、それでも認識されません。

4

3 に答える 3

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

var a = new reddit();

a.login("username", "password");
于 2012-12-16T20:48:09.543 に答える
0

この問題について考えが変わりました。get が予約されているということではなく、2 つのスタイルのオブジェクト定義 (関数とプロトタイプ) を組み合わせて、インスタンス化していない関数でメソッドを実行しようとしているということです。self.post は、実際に reddit オブジェクトをインスタンス化するまで存在しません。

self.post 関数定義をプロトタイプに移動して静的メソッドとして使用できるようにするか、ログイン関数定義を関数定義内に移動して実際にオブジェクトをインスタンス化してそのメソッドを使用するのが最善だと思います.

于 2012-12-16T20:49:37.250 に答える
0

この構造:

var reddit = function () { };

クラスではなく関数を定義しているだけです。newそれを呼び出してオブジェクトを作成するには、オペレーターが必要です。おそらくこれを使用したいでしょう:

var reddit = new function () { };

関数を呼び出し、(匿名) クラスのオブジェクトを作成します。コードの残りの部分はそのまま機能するはずです。

于 2012-12-16T20:50:19.403 に答える