1

我有一个接受用户输入并将数据打印到网页的表单。我的目标是连接到 Twitter API 并根据输入结果打印数据。例如,如果用户输入某个主题标签,那么我希望打印所有带有输入数据的主题标签。我能够获取输入数据并打印它,我还能够在单击时从主题标签打印数据(没有输入数据)。但是,当我尝试使用输入表单实现 Twitter 搜索时,缺少一些东西。

我的表格

<form class="form" action="/" method="post" name="form">              
    <input type="text" name="twdata" placeholder="Add data">
    <button type="submit">Submit</button>
</form>

我的带有 Twitter API 的 js(不工作)

var theTweets = [];

app.post('/',function(req,res){
    // Grab form data and push it to array
    var twdata = req.body.twdata;

    var params = {
       q: twdata
    }

    client.get('search/tweets', params, getData);

    function getData(err, data, response) {
        var content = data.statuses;
        for (var i = 0; i < content.length; i++) {
            theTweets.push( content[i].text );
        }
    }

    // Display form data on home template
    res.render('home', {twData: theTweets});
});

我的 js 没有 Twitter API(工作)

var formData = [];

app.post('/',function(req,res){
    // Grab form data and push it to array
    var twdata = req.body.twdata;
    formData.push(twdata);

    // Display form data on home template
    res.render('home', {dataInfo: formData});
});

我究竟做错了什么?

4

1 回答 1

2

我认为主要问题是由于您正在使用 Node.js (Express) 并且您必须注意异步调用,这是使用 Node.js 时的主要问题,我们必须改变对执行顺序的看法,因为这不是程序执行。我尝试将您的程序模拟为 Node.js 普通应用程序,请检查以下内容:

var theTweets  = [];

var res = {
    render: function (page, objData) {
        console.log(page +' '+objData.tweets);
    }
}
var req = {
    body: {
        twdata: '@user'
    }
}

var app = {
    post: function (page, callback) {
        console.log('Page invoked '+page);
        callback(req, res);
    }
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

var client = {
    get : async function (tweets, params, callback) {
        var err = '';
        var data = {statuses: [{text:'tweet01'},{text:'tweet02'}]};
        var response = {};
        await sleep(2000); //code for simulate delay in async call to twitter
        callback(err, data, response);
    }
}

app.post('/', function(req, res) {
    var twdata = req.body.twdata;

    var params = {
       q: twdata
    }

    client.get('search/tweets', params, getData);

    function getData(err, data, response) {
        var content = data.statuses;

         content.forEach ((tweet)=>theTweets.push(tweet.text));

        res.render('home', {'tweets': theTweets});  //correct 
    }
    //res.render('home', {'tweets': theTweets});    //wrong 
});
于 2018-05-04T09:26:34.093 回答