NodeJS-在函数中调用Fetch会挂起控制台



我的React客户端遇到了一个问题,所以我使用一个更简单的单文件节点程序重现了这个错误。在react客户端中,我不会返回任何数据。使用Postman,我可以做一个";获取"并检索JSON数据。

有人能帮我把它挂起来吗?

我最近在服务器端gettranslations中做了一个类似的函数,这样我就可以从一个函数中调用MongoDB。(MongoClient GetData例程的NodeJS ASync调用(。我想我遵循的模式与我的答案相同。

我想用";等待";但我不在异步函数中。我不需要";在我刚刚提到的上面的例子中,await,因为函数使用了";。那么";图案

部分代码:

const fetch = require("node-fetch");
function getDBLanguagesAndConvertToDataTable(fromLanguage, toLanguage) { 
// TODO implement from/to Language in URL below  
console.log("Function: " + getFormattedTime())
return fetch('http://localhost:3001/api/gettranslations/en-US/es-MX', {
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
.then(function(data) {
// do something with the data 
console.log("Status:", data.status)
console.log("data from DB:")
console.log(JSON.stringify(data)) 
console.log("data.body:")
console.log(JSON.stringify(data.json())) 
// I call another function here to reshape the data, 
// but even with that commented out, same issue. 
return data.json() 
})
.catch(function(err){
console.log("Error:" + err)
throw new Error(err) 
})
}

console.log("------- Test with Fetch/Get/FromWebservice -------")
console.log(getFormattedTime())
var fromLanguage = 'en-US'
var toLanguage = 'es-MX'
getDBLanguagesAndConvertToDataTable(fromLanguage, toLanguage)
.then(function (dataTable) {
console.log(getFormattedTime, " Back from call fetch")
var strDataTable = JSON.stringify(dataTable, null, 3);  
console.log("ReactTables(): Resulting DataTable=")
console.log(strDataTable) 
console.log(getFormattedTime(), "The end of tests ")    
})

我跑";js";。它显示以下内容并挂起。我必须做CNTL Break来结束它。

------- Test with Fetch/Get/FromWebservice -------
2020-08-26-20-43-08
Function: 2020-08-26-20-43-08

第2部分-添加Catches后

修订代码:

function getDBLanguagesAndConvertToDataTable(fromLanguage, toLanguage) { 
// TODO implement from/to Language in URL below  
console.log("Function: " + getFormattedTime())
return fetch('http://localhost:3001/api/gettranslations/en-US/es-MX', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
})
.then(function(data) {
// do something with the data 
console.log("Status:", data.status)
console.log("data from Fetch:")
console.log(JSON.stringify(data)) 
console.log("data.json():")
console.log(JSON.stringify(data.json())) 

//var tmpDataTable = convertMongoLanguagesToDataTable(data.json())
//return tmpDataTable
return data.json() 
})
.catch(function(err){
console.log("Fetch Error:" + err)
throw new Error(err) 
})
}
/*
console.log("------- Test with variable data-------------")
console.log(getFormattedTime())
dataTable = convertMongoLanguagesToDataTable(dbGetResults) 
var strDataTable = JSON.stringify(dataTable, null, 3);  
console.log("Resulting DataTable=")
console.log(strDataTable) 
console.log("nn")
*/ 
console.log("------- Test with Fetch/Get/FromWebservice -------")
console.log(getFormattedTime())
var fromLanguage = 'en-US'
var toLanguage = 'es-MX'
getDBLanguagesAndConvertToDataTable(fromLanguage, toLanguage)
.then(function (dataTable) {
console.log(getFormattedTime, " Back from call fetch")
var strDataTable = JSON.stringify(dataTable, null, 3);  
console.log("ReactTables(): Resulting DataTable=")
console.log(strDataTable) 
console.log(getFormattedTime(), "The end of tests ")    
.catch(function (err){
console.log("call function getDBLanguagesAndConvertToDataTable error:", 
getFormattedTime(), "The end of tests ")    

})
})

输出:

------- Test with Fetch/Get/FromWebservice -------
2020-8-26-21-31-5
Function: 2020-8-26-21-31-5
Status: 200
data from Fetch:
{"size":0,"timeout":0}
data.body:
{}
Fetch Error:TypeError: body used already for: http://localhost:3001/api/gettranslations/en-US/es-MX
(node:38732) UnhandledPromiseRejectionWarning: Error: TypeError: body used already for: http://localhost:3001/api/gettranslations/en-US/es-MX
at E:GitHubNealWaltersKyleShedCompanyPOCshedco-backendtest_convert_languages_to_data_table.js:144:12
at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:38732) 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(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 3)
(node:38732) [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.

根据上面@jfriend00的评论,我需要在每个.then语句上都有.catch。

一旦我有了捕获,我就遇到了一个错误,因为我试图访问流两次,所以现在我只是在";数据";从获取中返回的变量。(发现此处描述的错误:https://github.com/node-fetch/node-fetch/issues/533)

这时,我可以从控制台的Web服务中看到我的JSON,不再挂起!

修订代码:

function getDBLanguagesAndConvertToDataTable(fromLanguage, toLanguage) { 
// TODO implement from/to Language in URL below  
console.log("Function: " + getFormattedTime())
return fetch('http://localhost:3001/api/gettranslations/en-US/es-MX', {
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
.then(function(data) {
// do something with the data 
/*
console.log("Status:", data.status)
console.log("data from Fetch:")
console.log(JSON.stringify(data)) 
console.log("data.json():")
console.log(JSON.stringify(data.json())) 
*/ 

//var tmpDataTable = convertMongoLanguagesToDataTable(data.json())
//return tmpDataTable
return data.json() 
})
.catch(function(err){
console.log("Fetch Error:" + err)
throw new Error(err) 
})
}
/*
console.log("------- Test with variable data-------------")
console.log(getFormattedTime())
dataTable = convertMongoLanguagesToDataTable(dbGetResults) 
var strDataTable = JSON.stringify(dataTable, null, 3);  
console.log("Resulting DataTable=")
console.log(strDataTable) 
console.log("nn")
*/ 
console.log("------- Test with Fetch/Get/FromWebservice -------")
console.log(getFormattedTime())
var fromLanguage = 'en-US'
var toLanguage = 'es-MX'
getDBLanguagesAndConvertToDataTable(fromLanguage, toLanguage)
.then(function (dataTable) {
console.log(getFormattedTime, " Back from call fetch")
var strDataTable = JSON.stringify(dataTable, null, 3);  
console.log("ReactTables(): Resulting DataTable=")
console.log(strDataTable) 
console.log(getFormattedTime(), "The end of tests ")    
})
.catch(function (err){
console.log("call function getDBLanguagesAndConvertToDataTable error:", 
getFormattedTime(), "The end of tests ")    

})

相关内容

  • 没有找到相关文章

最新更新