增加React中的超时时间-neo4j应用

时间:2018-07-03 17:20:20

标签: javascript reactjs neo4j axios

我正在尝试增加React应用的超时时间。我正在使用axios,所以最初我尝试过:

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

它不起作用,并且有处理它的相应线程:

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

因此,我尝试了以下代码:

 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);
      }

它也不起作用。该请求超时,即使在Node.js后端上我也看到返回正确的结果,但我看到了空的响应错误。在后端,我向Neo4j数据库发出了非常长时间的请求。我怀疑它可能会超时,因此我在neo4j.config文件中添加了以下几行:

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

我在这里找到的:

How to configure a query timeout in Neo4j 3.0.1

并重新启动neo4j,但也没有帮助。这是我在终端中看到的内容:

enter image description here

我不确定这个问题POST /gene_info - - ms - -是在前端还是在后端,但是我怀疑neo4j现在超时了,但仍然存在计算使用console.log()语句看到的结果。任何建议将不胜感激。

  

更新

我尝试使用Reacts fetch,但仍然无法正常工作。这是代码:

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);
});
}

然后我这样调用此函数:

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

更新

我尝试使用axios.create()函数没有成功:

  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);
    });

如果前端似乎没有任何作用,我认为这是neo4j驱动程序引起的超时,即使以某种方式返回了结果。这是我用于驱动程序的代码:

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();
});
})

或者也许我正在使用express.Router();处理后端上的getpost请求的Node.js

2 个答案:

答案 0 :(得分:1)

如果要在axios中配置超时,可以使用

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

5000替换为您需要的超时值。

答案 1 :(得分:0)

最终我找到了在这里有效的解决方案:

Node Express specific timeout value per route

然后我通过以下方式使用了setConnectionTimeout()函数:

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