node.js - 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);
}
};
在沙箱中它似乎工作正常,但在我的服务器上却没有。
解决方案
推荐阅读
- python - 使用 os.path.join 打开非扩展文件
- next.js - 如何在 Next.js 中创建可重用组件
- arrays - 为什么在 Perl 中使用正则表达式拆分字符串后数组中还有一个额外的空元素?
- python - Python 基础为什么 set() 有效但 {} 失败?
- python - 为什么绿色运行按钮是灰色/禁用的?皮查姆
- node.js - 如何修复从后端服务器获取的文本数据格式?
- javascript - 脚本试图从错误的文件中定义一个函数
- drupal - Drupal 8 jsonapi:如何更改返回的json关系包含数组的结构?
- python - Odoo 12 如何在一个字段中显示模型记录,具体取决于在其他字段中选择的模型
- python - 切片字符串以满足 if 条件