【问题标题】:How can I change request url by every each loop?如何在每个循环中更改请求 url?
【发布时间】:2017-02-11 05:38:15
【问题描述】:

我正在尝试使用 requestcheerio 从 post param 的链接中获取每个视频的 src。

要获取每个视频的 src,我应该通过每个循环更改请求选项的 url。但是当我尝试获取类似下面代码的 src 时,更改请求的 url 比请求更快,因此更改请求的 url 是在请求​​完成之前完成的。我可以做些什么来实现我想要的?

这是代码

let opt = {
    transform: function(body) {
        return cheerio.load(body);
    }
};

router.post('/api', function(req, res) {
    let idArray = req.body.data;
    for(var i=0; i<idArray.length; i++) {
        opt.uri = baseURL + idArray[i];

        request(opt)
          .then(function($)  {
               console.log($('video').src);
           }

日志(打印同样的东西 https://example.mp4/asdfasdf https://example.mp4/asdfasdf

编辑

当我使用这段代码时,我从 idArray[i] 得到 undefined

for(var i=0; i<idArray.length; i++) {
        console.log("Before", baseURL + idArray[i])
        rpap(baseURL + idArray[i])
          .then(function($) {
              console.log(idArray);
              console.log("After", baseURL + idArray[i]);
}

日志

before http://example.com/adsfasdf
 before http://example.com/famvvasd
 after  http://example.com/undefined
 after  http://example.com/undefined

【问题讨论】:

    标签: javascript node.js request cheerio node-request


    【解决方案1】:

    为什么不将新的 uri 与全局选项对象合并?我建议不要更改全局选项对象,因为可以发出多个请求并且可以以意想不到的方式更改道具。

    for (var i = 0; i < idArray.length; i++) {
      let uri = baseURL + idArray[i];
    
      request({
          ...opt,
          uri // expands to uri: uri as per es6 style
        })
        .then(function($) {
          console.log($('video').src);
        })
    }
    

    另外,如果您总是使用转换选项,那么您可以将其设置为默认值。使用 request-promise 它看起来像这样(来自他们的文档):

    var rpap = rp.defaults({ transform: autoParse });
    
    rpap('http://google.com')
        .then(function (autoParsedBody) {
            // :)
        });
    
    rpap('http://echojs.com')
        .then(function (autoParsedBody) {
            // =)
        });
    

    【讨论】:

    • @PhillipYS 这是ES6 destructuring assignment 的一部分。基本上...optopt 中的所有属性扩展为写入它的对象。 {uri} 是有效的 ES6,与 {uri: uri} 的含义相同。所以处理后的代码类似于request({ transform: function(){...}, uri: uri })
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 2018-09-05
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多