微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NodeJS-调用函数中的提取将挂起控制台

如何解决NodeJS-调用函数中的提取将挂起控制台

我在React客户端遇到问题,所以我使用一个更简单的单文件节点程序重现了该错误。在React客户端中,我没有得到任何数据。使用Postman,我可以执行“获取”并检索JSON数据。

有人可以帮助我让它运行而不会挂吗?

我最近在服务器端进行了gettranslations的类似功能,以便可以从一个函数调用MongoDB。 (NodeJS ASync call of MongoClient GetData routine)。我认为我的回答与我的回答相同。

我曾考虑使用“ await”,但是我不在异步函数中。在上面提到的示例中,我不需要“等待”,因为该函数使用“ .then”模式。

部分代码

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 ")    

})

我运行“ node test.js”。它显示以下内容并挂起。我必须做CNTL-Break结束它。

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

第2部分-添加抓取后

修改后的代码

function getDBLanguagesAndConvertToDataTable(fromLanguage,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,3);  
console.log("Resulting DataTable=")
console.log(strDataTable) 
console.log("\n\n")
*/ 

console.log("------- Test with Fetch/Get/FromWebservice -------")
console.log(getFormattedTime())
var fromLanguage = 'en-US'
var toLanguage = 'es-MX'

getDBLanguagesAndConvertToDataTable(fromLanguage,"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:\GitHub\NealWalters\KyleShedCompanyPOC\shedco-backend\test_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。

一旦发现问题,我就会因为尝试访问流两次而收到错误消息,所以现在我只注释掉从fetch返回的“ data”变量上的多余console.logs。 (发现此处描述的错误: https://github.com/node-fetch/node-fetch/issues/533

到那时,我可以从控制台中的webservice看到我的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("\n\n")
*/ 

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,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 ")    
        
    })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。