NODE JS取消请求

NODE JS cancel request

本文关键字:请求 取消 JS NODE      更新时间:2023-09-26

我正在使用此代码下载节点js:中的文件

var currentVideoRequest = null;
window.spawnVideoPlayer = function (url, subs, movieModel,tag) {
    if(currentVideoRequest) {
    try
    {
      currentVideoRequest.abort();
    }
    catch(err)
    {
      alert(err.message);
    }
    }
    var fs = require('fs');
    var urlrequest = currentVideoRequest = require('request');
    urlrequest.get({url: url, encoding: 'binary'}, function (err, response, body) {
      fs.writeFile(FILEURL, body, 'binary', function(err) {
      }); 
    });
}

currentVideoRequest.abort();中,我得到了这个错误:

    Object function request(uri, options, callback) {
  if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.')
  if ((typeof options === 'function') && !callback) callback = options
  if (options && typeof options === 'object') {
    options.uri = uri
  } else if (typeof uri === 'string') {
    options = {uri:uri}
  } else {
    options = uri
  }
  options = copy(options)
  if (callback) options.callback = callback
  var r = new Request(options)
  return r
} has no method 'abort'

要添加到@Etai的答案中,在将请求模块用于请求的一个实例之前,您需要它。类似这样的东西:

var request = require('request');
// ...
// then later in the code
var urlrequest = request.get(uri, function(err, response, body) {
    // process data here
});
// later, you'd abort this as:
urlrequest.abort();

请注意,我将使用var urlrequest = request.get(params, callback);保存该实例,以便稍后对其调用abort。

currentVideoRequest是请求对象的构造函数,而不是请求对象,这就是为什么它失败的原因。

请求构造函数在调用时返回一个请求对象,即

require('request')('uri', function(err, resp, body){})

您可以使用abort()方法来停止该请求。

var reqObj = request({uri: 'https://jsonplaceholder.typicode.com/albums'  }, function (error, response, body) {
    console.log('API requested ') ;
    if (!err){
        console.log(body);
    }
    else
    {
        console.log(err);
    }
});
reqObj.abort();

我认为您可以使用此方法来获得所需内容。我以这种方式使用异步,这使得代码更干净,回调更少。

(async function main() {
    try {
        let urlRequest = await customRequest("http://127.0.0.1:8000/api/product/search?title=foo");
        urlRequest.abort();
    } catch (e) {
        console.log(e);
    }
})();
function customRequest(url) {
    return new Promise((resolve, reject) => {
        request.get(url, (err, res) => {
            if (err) reject(err)
            if (res.statusCode !== 200)
                reject("my Error ");
            resolve(res);
        })
    })
}

此外,如果您不需要回答urlRequest变量,您可以从函数中删除await,如下所示。

try {
        let urlRequest =  customRequest("http://127.0.0.1:8000/api/product/search?title="); // run in background !
        urlRequest.abort();
    } catch (e) {
        console.log(e);
    }

最后,由于如果您犯了错误,我们的请求会返回一个异常,因此如果需要,您可以在catch块中写入abort()。

(async function main() {
    try {
        var urlRequest =await  customRequest("http://127.0.0.1:8000/api/product/search?title=");
    } catch (e) {
        urlRequest.abort();
        console.log(e);
    }
})();

此外,由于customRequest()函数返回promise note,因此使用then()而不是async await。