首页 > 解决方案 > request-promise 无法使用 resolveWithFullResponse: true 找到状态代码

问题描述

我正在运行快递 api。我正在尝试向外部 url 发出请求,但我似乎无法获得状态代码。

var request = require('request');
var rp = require('request-promise');
var url = require("url");

checkStatus = function(urlParam, result) {
  var valid = url.parse('http://'+urlParam);
  if(valid != null){
    console.log('http://'+urlParam)
    var _include_headers = function(body, response, resolveWithFullResponse) {
      return {'headers': response.headers, 'data': body};
    };
    const options = {
      url: `http://${urlParam}`,
      followAllRedirects: true,
      method: 'get',
      gzip: true,
      transform: _include_headers,
        resolveWithFullResponse: true,
/*      headers: {
        'User-Agent': userAgent
      },*/
    };
    rp(options)
      .then( (response, error, data) => {

        console.log(response.headers)

          result(null,[{error: false, statusCode: response.statusCode, url: urlParam}]);

      })
      .catch(function (err) {
        console.log(err)
      });
  }else{
    result([{error:true,message: 'Invalid URI'}], null);
  }
};
...

如您所见,响应标头不是我所期望的。如果我通过了无效的网址,它仍然会返回为200 OK

日志记录

    http://www.doesnotexist.com
{
  'cache-control': 'public, max-age=0, must-revalidate',
  'content-type': 'text/html; charset=UTF-8',
  date: 'Wed, 14 Aug 2019 13:49:32 GMT',
  etag: '"5441e99d4c336b4a7d2d11a0f7608823-ssl-df"',
  'strict-transport-security': 'max-age=31536000',
  'content-encoding': 'gzip',
  'content-length': '2794',
  age: '133527',
  connection: 'close',
  server: 'Netlify',
  vary: 'Accept-Encoding',
  'x-nf-request-id': 'eb65c73f-aab2-4162-aba2-531393bf1a6a-455006'
}
GET /health/www.doesnotexist.com 200 416.698 ms - 46

如果您在浏览器中尝试该 url,您会看到它应该返回200 OK http://www.doesnotexist.com

https://codesandbox.io/s/newsnowapi-nodejs-g1rsn

如果您浏览沙箱并尝试附加/health/www.doesnotexist.com到 url,您可以模拟我的问题。代码在model/healthcheck.js

这是我的服务器上的响应输出,它没有提供正确的值,但在代码和框中工作正常

{
  status: 200,
  statusText: 'OK',
  headers: {
    date: 'Fri, 16 Aug 2019 11:28:27 GMT',
    server: 'Apache',
    'x-powered-by': 'PHP/7.2.1',
    vary: 'Accept-Encoding,Cookie',
    'cache-control': 'max-age=3, must-revalidate',
    'x-xss-protection': '1; mode=block',
    'x-content-type-options': 'nosniff',
    'x-frame-options': 'SAMEORIGIN',
    connection: 'close',
    'transfer-encoding': 'chunked',
    'content-type': 'text/html; charset=UTF-8'
  },
  config: {
    url: 'http://www.doesnot.work',
    method: 'get',
    headers: {
      Accept: 'application/json, text/plain, */*',
      'User-Agent': 'axios/0.19.0'
    },
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    adapter: [Function: httpAdapter],
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    validateStatus: [Function: validateStatus],
    data: undefined
  },
  request: ClientRequest {
    _events: [Object: null prototype] {
      socket: [Function],
      abort: [Function],
      aborted: [Function],
      error: [Function],
      timeout: [Function],
      prefinish: [Function: requestOnPrefinish]
    },
    _eventsCount: 6,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    useChunkedEncodingByDefault: false,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: 0,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: Socket {
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'www.banglarelief.org',
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: null,
      _server: null,
      parser: null,
      _httpMessage: [Circular],
      [Symbol(asyncId)]: 118,
      [Symbol(kHandle)]: [TCP],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0
    },
    connection: Socket {
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'www.banglarelief.org',
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: null,
      _server: null,
      parser: null,
      _httpMessage: [Circular],
      [Symbol(asyncId)]: 118,
      [Symbol(kHandle)]: [TCP],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0
    },
    _header: 'GET / HTTP/1.1\r' +
      '\nAccept: application/json, text/plain, */*\r' +
      '\nUser-Agent: axios/0.19.0\r' +
      '\nHost: www.banglarelief.org\r' +
      '\nConnection: close\r' +
      '\n\r' +
      '\n',
    _onPendingData: [Function: noopPendingOutput],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 1,
      _maxListeners: undefined,
      defaultPort: 80,
      protocol: 'http:',
      options: [Object],
      requests: {},
      sockets: [Object],
      freeSockets: {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256
    },
    socketPath: undefined,
    method: 'GET',
    path: '/',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      readable: false,
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      socket: [Socket],
      connection: [Socket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 200,
      statusMessage: 'OK',
      client: [Socket],
      _consuming: true,
      _dumped: false,
      req: [Circular],
      responseUrl: 'http://www.banglarelief.org/',
      redirects: []
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    _redirectable: Writable {
      _writableState: [WritableState],
      writable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _options: [Object],
      _redirectCount: 1,
      _redirects: [],
      _requestBodyLength: 0,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function],
      _currentRequest: [Circular],
      _currentUrl: 'http://www.banglarelief.org/',
      _isRedirect: true
    },
    [Symbol(isCorked)]: false,
    [Symbol(outHeadersKey)]: [Object: null prototype] {
      accept: [Array],
      'user-agent': [Array],
      host: [Array]
    }
  },

我的快速沙箱https://codesandbox.io/s/newsnowapi-nodejs-g1rsn

我的快递回来了

HealthCheck.checkStatus = function(urlParam, result) {
  var valid = url.parse("http://" + urlParam);
  if (valid != null) {
    console.log("http://" + urlParam);
    try {
      axios
        .get("http://" + urlParam)
        .then(response => {
          if (response.isAxiosError) {
            result([{ error: true, message: "Unknown error" }], null);
          }

          console.log("success");
          result(null, [{ error: false, statusCode: 200 }]);
        })
        .catch(error => {
          console.log("error");
          result([{ error: true, message: error.message }], null);
        });
    } catch (error) {
      console.error("getStatus" + error.message);
      result(
        {
          error: true,
          message: error.message,
          statusCode: error.statusCode && error.statusCode
        },
        null
      );
    }
  } else {
    result([{ error: true, message: "Invalid URI" }], null);
  }
};

在沙箱中它似乎工作正常,但在我的服务器上却没有。

标签: node.jsexpressrequest-promise

解决方案


推荐阅读