Request-promise爬取不存在链接时始终返回成功的问题
解决request-promise请求不存在链接时不返回错误的问题
嘿,这个问题我熟!request-promise 默认的行为确实容易让人踩坑——它只会在真正的网络错误(比如连不上服务器、DNS解析失败)时才会拒绝 Promise,但如果服务器返回了 HTTP 错误状态码(比如 404 页面不存在、500 服务器错误),它会把这个响应当成“成功”的结果返回,不会抛出错误。
下面给你两种实用的解决办法:
方法一:启用 simple: true 选项
这是最直接的方式,给请求配置加上 simple: true,只要响应状态码不是 2xx,request-promise 就会自动抛出错误,进入 catch 块处理:
var rp = require('request-promise'); const fs = require('fs'); var moment = require('moment'); var date = moment().format('MMMM Do YYYY, h:mm:sSS a'); var status; var proxyCheck = { method: 'GET', url: 'http://googleeeukss', proxy: 'http://localhost', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3107.4 Safari/537.36' }, simple: true // 启用该选项捕获HTTP状态码错误 } rp(proxyCheck) .then(response => { console.log("请求成功:", response); }) .catch(error => { console.log("请求出错:", error.message); // 这里可以统一处理网络错误、HTTP状态码错误等情况 });
方法二:手动检查响应状态码
如果你需要更精细的控制(比如只想针对特定状态码抛出错误),可以开启 resolveWithFullResponse 选项获取完整响应对象,然后在 then 里手动判断状态码:
var rp = require('request-promise'); const fs = require('fs'); var moment = require('moment'); var date = moment().format('MMMM Do YYYY, h:mm:sSS a'); var status; var proxyCheck = { method: 'GET', url: 'http://googleeeukss', proxy: 'http://localhost', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3107.4 Safari/537.36' }, resolveWithFullResponse: true // 获取包含statusCode的完整响应对象 } rp(proxyCheck) .then(response => { // 判断状态码是否在2xx范围内 if (response.statusCode < 200 || response.statusCode >= 300) { throw new Error(`请求失败:HTTP状态码${response.statusCode}`); } console.log("请求成功:", response.body); }) .catch(error => { console.log("请求出错:", error.message); });
另外提一句:你代码里请求的 http://googleeeukss 是无效域名,如果代理环境没有返回异常响应的话,理论上应该会触发DNS解析失败的网络错误,自动进入catch块。如果还是没触发,建议检查下代理的配置是否有异常哦。
内容的提问来源于stack exchange,提问作者user9163418
相关产品推荐
相关产品推荐

