admin管理员组

文章数量:1391804

I am trying to increase the timeout time of my React app. I am using axios, so initially I tried:

axios.post('/gene_info', postData, {timeout: timeoutVal});

It did not work, and there is the respective thread that deals with it:

So, I tried the following code:

 let CancelToken = axios.CancelToken;
      const source = CancelToken.source();
      try {
          let response = null;
          setTimeout(() => {
              if (response === null) {
                  source.cancel();
              }
          }, 60 * 1500 * 1000);

          response = await axios.post('/gene_info', postData, {cancelToken: source.token});
          console.log(response);
      } catch (error) {
          console.log(error);
      }

And it is not working either. The request times out and I see the empty response error, even though on the Node.js backend I see that the result is returned correctly. On the backend I am making a very long running request to Neo4j database. I got a suspicion that maybe it timeouts, so I added to neo4j.config file the following lines:

unsupported.dbms.executiontime_limit.enabled=true
unsupported.dbms.executiontime_limit.time=99999999999999s

That I found here:

How to configure a query timeout in Neo4j 3.0.1

and restarted neo4j but it did not help either. Here is what I see in the terminal:

I am not sure what this POST /gene_info - - ms - - means, whether the problem is still on the front end, or the back end, but I have a suspicion that neo4j now times out, but it is still calculating the result which I see using console.log() statements. Any suggestions would be greatly appreciated.

Update

I tried using Reacts fetch, but still not working. Here is the code:

fetchWithTimeout = (url, postData, timeout) => {
let didTimeOut = false;

new Promise(function(resolve, reject) {
    const timeout = setTimeout(function() {
        didTimeOut = true;
        reject(new Error('Request timed out'));
    }, timeout);

    fetch(url, {
        method: 'POST',
        headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        },
        timeout: timeout,
        body: JSON.stringify(postData)
    })
    .then(function(response) {
        // Clear the timeout as cleanup
        clearTimeout(timeout);
        if(!didTimeOut) {
            console.log('fetch good! ', response);
            resolve(response);
        }
    })
    .catch(function(err) {
        console.log('fetch failed! ', err);

        // Rejection already happened with setTimeout
        if(didTimeOut) return;
        // Reject with error
        reject(err);
    });
})
.then(function() {
    // Request success and no timeout
    console.log('good promise, no timeout! ');
})
.catch(function(err) {
    // Error: response error, request timeout or runtime error
    console.log('promise error! ', err);
});
}

Then I am calling this function like that:

let postData = {"jsonData": geneNameArr,
                    "datasetName": this.props.datasetName};
this.fetchWithTimeout('/gene_info', postData, timeout).then((response) => {
        console.log("fetchWithTimeout is done!");
        console.log(response);
      });

Update

I tried using axios.create() function with no success:

  const axiosInstance = axios.create({
        baseURL: '/gene_info',
        timeout: timeout
    });

    axiosInstance.post('', postData).then((response) => {
      console.log("axios request is done with create() method");
      console.log(response);
    });

If nothing seems to work on the front end, I would think it is the timeout that es from the neo4j driver, even though somehow the results are returned. Here is the code I am using for the driver:

router.post('/gene_info', function(req, res) {
...
...
var driver = dbUtils.driver;
const session = driver.session();
session.run(
  full_query,
  {}
 ).then(result => {
  const exprData = chartService.prepareGeneInfoData(result, '');
  res.json({
    exprData
  });

  session.close();
});
})

Or maybe it can also be express.Router(); that I am using for treating get and post requests on the backend with Node.js

I am trying to increase the timeout time of my React app. I am using axios, so initially I tried:

axios.post('/gene_info', postData, {timeout: timeoutVal});

It did not work, and there is the respective thread that deals with it:

https://github./axios/axios/issues/647

So, I tried the following code:

 let CancelToken = axios.CancelToken;
      const source = CancelToken.source();
      try {
          let response = null;
          setTimeout(() => {
              if (response === null) {
                  source.cancel();
              }
          }, 60 * 1500 * 1000);

          response = await axios.post('/gene_info', postData, {cancelToken: source.token});
          console.log(response);
      } catch (error) {
          console.log(error);
      }

And it is not working either. The request times out and I see the empty response error, even though on the Node.js backend I see that the result is returned correctly. On the backend I am making a very long running request to Neo4j database. I got a suspicion that maybe it timeouts, so I added to neo4j.config file the following lines:

unsupported.dbms.executiontime_limit.enabled=true
unsupported.dbms.executiontime_limit.time=99999999999999s

That I found here:

How to configure a query timeout in Neo4j 3.0.1

and restarted neo4j but it did not help either. Here is what I see in the terminal:

I am not sure what this POST /gene_info - - ms - - means, whether the problem is still on the front end, or the back end, but I have a suspicion that neo4j now times out, but it is still calculating the result which I see using console.log() statements. Any suggestions would be greatly appreciated.

Update

I tried using Reacts fetch, but still not working. Here is the code:

fetchWithTimeout = (url, postData, timeout) => {
let didTimeOut = false;

new Promise(function(resolve, reject) {
    const timeout = setTimeout(function() {
        didTimeOut = true;
        reject(new Error('Request timed out'));
    }, timeout);

    fetch(url, {
        method: 'POST',
        headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        },
        timeout: timeout,
        body: JSON.stringify(postData)
    })
    .then(function(response) {
        // Clear the timeout as cleanup
        clearTimeout(timeout);
        if(!didTimeOut) {
            console.log('fetch good! ', response);
            resolve(response);
        }
    })
    .catch(function(err) {
        console.log('fetch failed! ', err);

        // Rejection already happened with setTimeout
        if(didTimeOut) return;
        // Reject with error
        reject(err);
    });
})
.then(function() {
    // Request success and no timeout
    console.log('good promise, no timeout! ');
})
.catch(function(err) {
    // Error: response error, request timeout or runtime error
    console.log('promise error! ', err);
});
}

Then I am calling this function like that:

let postData = {"jsonData": geneNameArr,
                    "datasetName": this.props.datasetName};
this.fetchWithTimeout('/gene_info', postData, timeout).then((response) => {
        console.log("fetchWithTimeout is done!");
        console.log(response);
      });

Update

I tried using axios.create() function with no success:

  const axiosInstance = axios.create({
        baseURL: '/gene_info',
        timeout: timeout
    });

    axiosInstance.post('', postData).then((response) => {
      console.log("axios request is done with create() method");
      console.log(response);
    });

If nothing seems to work on the front end, I would think it is the timeout that es from the neo4j driver, even though somehow the results are returned. Here is the code I am using for the driver:

router.post('/gene_info', function(req, res) {
...
...
var driver = dbUtils.driver;
const session = driver.session();
session.run(
  full_query,
  {}
 ).then(result => {
  const exprData = chartService.prepareGeneInfoData(result, '');
  res.json({
    exprData
  });

  session.close();
});
})

Or maybe it can also be express.Router(); that I am using for treating get and post requests on the backend with Node.js

Share Improve this question edited Jul 4, 2018 at 19:20 Nikita Vlasenko asked Jul 3, 2018 at 17:20 Nikita VlasenkoNikita Vlasenko 4,3528 gold badges54 silver badges96 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 2

If you want to configure your timeout in axios, you can use,

const axiosInstance = axios.create({
    baseURL: "http://example./api/",
    timeout: 5000
});

Replace 5000 with your timeout value needed.

Ultimately I found the solution that worked here:

Node Express specific timeout value per route

And I used the setConnectionTimeout() function in the following way:

router.post('/gene_info', setConnectionTimeout('12h'), function(req, res) {
    ...
})

本文标签: javascriptIncrease timeout time in Reactneo4j appStack Overflow