【问题标题】:Proper way to implement AJAX request server-side in Node.js在 Node.js 中实现 AJAX 请求服务器端的正确方法
【发布时间】:2016-01-01 12:06:02
【问题描述】:

我正在构建一个搜索引擎,它会在客户端发布搜索字符串后在服务器端查询 Twitter 和 Wiki API。当我仍然完全是客户端时,对 Wiki API 的 AJAX 请求看起来像:

$.ajax({
    url: 'https://en.wikipedia.org/w/api.php',
    data: {
        action: 'query',
        list: 'search',
        srsearch: searchString, // variable pulled from input
        format: 'json',
        //origin: 'https://www.mediawiki.org'
    },
    xhrFields: {
        withCredentials: true
    },
    dataType: 'jsonp' // will probably use 'json' now that I'm server-side
}).done( function ( data ) {
    searchParser(data);
});
... //searchParser() below

现在,我已经实现了一个 Node.js Web 应用程序,它从主页上的客户端表单 POST (index.ejs) 中获取搜索字符串。然后,服务器将使用 wiki 和 twitter 搜索结果呈现结果页面 (results.ejs)。 Twitter API 搜索已使用 BoyCook's TwitterJSClient 处理。

我想知道从我的服务器执行此准确查询的最佳方式。我一直在环顾四周,找不到简洁的答案。有人对此有什么建议吗?

【问题讨论】:

  • Node 为此提供了http.request()http.get()
  • 当然可以,但是 dataType 字段和 xhrFields 字段呢?
  • 没有与dataType 等效的内置函数。您必须自己解析响应——JSON.parse()。至于凭据,Authorization 标头可能可用,如果来自客户端的请求包含它 - 您必须将其复制到此请求中。浏览器不会将与 en.wikipedia.orgtwitter.com 相关的 cookie 发送到您的服务器。
  • 感谢您的帮助。请参阅下面的最终结果。

标签: jquery ajax node.js express heroku


【解决方案1】:

这是我根据Jonathan's回复得出的解决方案:

function wikiSearch () {

    var query = querystring.stringify({
        action: 'query',
        list: 'search',
        srsearch: searchString,
        srlimit: 10,
        srwhat: 'text',
        format: 'json'
    });
    var options = {
        hostname: 'en.wikipedia.org',
        path: '/w/api.php?' + query
    };

    var req = https.request(options, function(res) {

        if (!res) { 
            wikiData = "An error occured!";
            complete();
        };

        var body = '';
        console.log("statusCode: ", res.statusCode);
        res.setEncoding('utf8');

        res.on('data', function(data) {
            body += data;
        });

        res.on('end', function() {
            wikiData = wikiDataParser( JSON.parse(body) );
            complete();
        });
    });

    req.end();
    req.on('error', function (err) {
        wikiData = "<h2>MediaWiki API is currently down.</h2>";
        complete();
    })

};
... // complete() is below

这会根据请求或响应更改 wikiData 变量。

【讨论】:

    【解决方案2】:

    了解 MEAN 堆栈。对于初学者,通常有人已经构建了一个模块,你可以使用 NPM 安装它,这将简化与 api 的连接。您可以手动完成,但如果有 node.js 的官方版本可用,则没有意义:

    npm install twitter
    

    下面进入您的主要快递应用程序文件。例如,它被简化了。

    //include this....loads the twitter client api app...will make this a breeze
            var Twitter = require('twitter');
    
        //your access keys and info to login into the api....fill them.
            var client = new Twitter({
              consumer_key: '',
              consumer_secret: '',
              access_token_key: '',
              access_token_secret: ''
            });
    
        //the below code executes when you hit this path
    
        app.post('/getTweetsYo', function (res, req, data) {
    
    // gets username from ajax post of user data....access via req.data. Passes it to twitter api request
            var params = {screen_name: req.data.username };
            client.get('statuses/user_timeline', params, function(error, tweets, response){
              if (!error) {
                console.log(tweets);
    
        // sending the tweets back to the front end!
    
        res.send(tweets);
    
              }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2015-05-08
      • 2018-01-31
      • 2012-01-12
      • 2017-01-22
      • 2015-10-08
      • 1970-01-01
      相关资源
      最近更新 更多