我正在尝试增加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
,但也没有帮助。这是我在终端中看到的内容:
我不确定这个问题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();
处理后端上的get
和post
请求的Node.js
答案 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) {
...
})