我是javascript的新手,无法弄清楚如何解决这个问题。我目前正在尝试创建一个小小的个人推特机器人,提醒他们注意。我发布了新推文,看到了新粉丝等。我用node.js和npm包Twit编写了这个机器人。我目前正在尝试创建一个创建新推文的功能。我的问题是,如果我尝试运行我的代码,我会从node.js收到错误。
这是我的bot.js文件
var config = require("./app/config");
var TwitterBot = require("./app/classes/TwitterBot");
var Twit = require("twit");
var T = new Twit(config);
var app = new TwitterBot(T);
app.tweet({ text: 'This is my test Tweet.' });
我的班级文件
module.exports = class TwitterBot {
constructor(T) {
this.T = T;
this.colors = require('colors/safe');
console.log("Class works");
}
tweet(data) {
this.T.post(
'statuses/update',
{ status: data.text },
function(err, data, response) {
if (err) {
this.error("Something went wrong");
} else {
this.success("Tweet successfully created");
}
}
);
}
error(something) {
console.log("Error: " + something);
// This is just an example in my code it performs a switch function
}
success(something) {
console.log("Success: " + something);
// This is just an example in my code it performs a switch function
}
}
我的错误:
Class works
C:\Users\Colin\Desktop\Twitter-Bot\app\classes\TwitterBot.js:14
this.error('tweet', err);
^
TypeError: Cannot read property 'error' of undefined
at C:\Users\Colin\Desktop\Twitter-Bot\app\classes\TwitterBot.js:14:15
at C:\Users\Colin\Desktop\Twitter-Bot\node_modules\twit\lib\twitter.js:118:13
at onRequestComplete (C:\Users\Colin\Desktop\Twitter-Bot\node_modules\twit\lib\twitter.js:324:7)
at Request.<anonymous> (C:\Users\Colin\Desktop\Twitter-Bot\node_modules\twit\lib\twitter.js:341:7)
at emitOne (events.js:101:20)
at Request.emit (events.js:188:7)
at Gunzip.<anonymous> (C:\Users\Colin\Desktop\Twitter-Bot\node_modules\request\request.js:1001:12)
at Gunzip.g (events.js:291:16)
at emitNone (events.js:91:20)
at Gunzip.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
我的问题是我无法在我的TwitterBot类中调用我的推文函数中的函数(错误或成功)。我曾经在php
中写这样的代码 public function tweet($text) {
// ... Some function that sends the tweet and returns ($err, $data, $response)
if ($err) {
// I call other functions inside the same class with $this->functionName();
$this->error($err);
}
}
protected function error($err) {
// do something with the $err variable
}
但是在javascript中,它似乎并没有像这样工作。有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
使用箭头功能。 function() { }
表示法的一个问题是它将this
更改为窗口对象。如果您改为使用() => { }
,则this
引用应保留您希望的值(例如您的类)。
以下是arrow functions的一组文档。请特别注意箭头函数在处理类变量(如this
和super
)方面的不同之处。
唯一可能的缺点是箭头功能在ES6之前的语言环境中不起作用,因此如果您需要在项目中使用广泛的浏览器支持,则可能需要使用像Babel这样的转换程序。鉴于它是一个服务器端应用程序,我怀疑这将成为一个问题。
答案 1 :(得分:1)
您可以通过绑定传递给this.T.post()
的回调函数或使用箭头函数来避免这种情况。将tweet
方法更改为:
tweet(data) {
this.T.post(
'statuses/update',
{ status: data.text },
(err, data, response) => { // this line got changed
if (err) {
this.error("Something went wrong");
} else {
this.success("Tweet successfully created");
}
}
);
}