问题
I want to be able to use my React app to make a GET request to my server, which is suppose to prompt my server to make an GET request to an external API. I'm using axios and tried using request but both are giving me ERRTIMEOUT. The request are definitely working as I've tried on my frontend application and the requests work
const express = require("express");
const axios = require("axios");
const router = express.Router();
router.get("/test", (req, res, next) => {
console.log("'/test' call");
axios.get("https://api.neoscan.io/api/main_net/v1/get_all_nodes")
.then(data => res.json(data))
.catch(err => res.secn(err));
})
module.exports = router;`
The error code
GGWP! { Error: connect ETIMEDOUT 104.25.167.105:443
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1113:14)
errno: 'ETIMEDOUT',
code: 'ETIMEDOUT',
syscall: 'connect',
address: '104.25.167.105',
port: 443,
config:
{ adapter: [Function: httpAdapter],
transformRequest: { '0': [Function: transformRequest] },
transformResponse: { '0': [Function: transformResponse] },
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: [Function: validateStatus],
headers:
{ Accept: 'application/json, text/plain, */*',
'User-Agent': 'axios/0.18.0' },
method: 'get',
url: 'https://api.neoscan.io/api/main_net/v1/get_all_nodes',
data: undefined },
request:
Writable {
_writableState:
WritableState {
objectMode: false,
highWaterMark: 16384,
finalCalled: false,
needDrain: false,
ending: false,
ended: false,
finished: false,
destroyed: false,
decodeStrings: true,
defaultEncoding: 'utf8',
length: 0,
writing: false,
corked: 0,
sync: true,
bufferProcessing: false,
onwrite: [Function: bound onwrite],
writecb: null,
writelen: 0,
bufferedRequest: null,
lastBufferedRequest: null,
pendingcb: 0,
prefinished: false,
errorEmitted: false,
emitClose: true,
bufferedRequestCount: 0,
corkedRequestsFree: [Object] },
writable: true,
_events:
{ response: [Function: handleResponse],
error: [Function: handleRequestError] },
_eventsCount: 2,
_maxListeners: undefined,
_options:
{ protocol: 'https:',
maxRedirects: 21,
maxBodyLength: 10485760,
path: '/api/main_net/v1/get_all_nodes',
method: 'get',
headers: [Object],
agent: undefined,
auth: undefined,
hostname: 'api.neoscan.io',
port: null,
nativeProtocols: [Object],
pathname: '/api/main_net/v1/get_all_nodes' },
_redirectCount: 0,
_redirects: [],
_requestBodyLength: 0,
_requestBodyBuffers: [],
_onNativeResponse: [Function],
_currentRequest:
ClientRequest {
_events: [Object],
_eventsCount: 6,
_maxListeners: undefined,
output: [],
outputEncodings: [],
outputCallbacks: [],
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: [TLSSocket],
connection: [TLSSocket],
_header:
'GET /api/main_net/v1/get_all_nodes HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nUser-Agent: axios/0.18.0\r\nHost: api.neoscan.io\r\nConnection: close\r\n\r\n',
_onPendingData: [Function: noopPendingOutput],
agent: [Agent],
socketPath: undefined,
timeout: undefined,
method: 'GET',
path: '/api/main_net/v1/get_all_nodes',
_ended: false,
res: null,
aborted: undefined,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
_redirectable: [Circular],
[Symbol(isCorked)]: false,
[Symbol(outHeadersKey)]: [Object] },
_currentUrl: 'https://api.neoscan.io/api/main_net/v1/get_all_nodes' },
response: undefined }
Here's the additional error code that I'm getting after responding
(node:35220) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
at JSON.stringify (<anonymous>)
at stringify (.\new-viewer\node_modules\express\lib\response.js:1119:12)
at ServerResponse.json (.\new-viewer\node_modules\express\lib\response.js:260:14)
at ServerResponse.send (.\new-viewer\node_modules\express\lib\response.js:158:21)
at axios.get.then.catch.err (.\new-viewer\server\api\index.js:45:27)
at process._tickCallback (internal/process/next_tick.js:68:7)
(node:40496) UnhandledPromiseRejectionWarning: TypeError: res.error is not a function
at axios.get.then.catch.err (.r\server\api\index.js:36:17)
at process._tickCallback (internal/process/next_tick.js:68:7)
(node:40496) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:40496) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
回答1:
Axios returns you the whole response, so if you try to send this you get a circular dependecy error.
So on .then(data => res.json(data))
, data is actually the response.
Try .then(response => res.json(response.data))
回答2:
You forgot to respond to the client:
try{
axios.get("https://api.neoscan.io/api/main_net/v1/get_all_nodes")
.then(data => res.status(200).send(data))
.catch(err => res.send(err));
}
catch(err){
console.error("GG", err);
}
回答3:
You don't have to enclose your axios call in a
try...catch
as axios already has a catch block.Your express handler has to send a response back when axios gets a response from the API call or axios catches an error during the API call.
Your code should look something like this
router.get("/test", (req, res, next) => {
console.log("'/test' call");
axios.get("https://api.neoscan.io/api/main_net/v1/get_all_nodes")
.then(data => res.json(data))
.catch(err => next(err));
})
If you fancy async...await
, you can write your code like this
router.get("/test", async (req, res, next) => {
console.log("'/test' call");
try {
const res = await axios.get("https://api.neoscan.io/api/main_net/v1/get_all_nodes");
res.json(data);
}
catch (err) {
next(err)
}
})
来源:https://stackoverflow.com/questions/53846709/how-do-i-use-axios-within-expressjs