我总是对第一个查询结果得到错误的响应(每次我更改查询时都会发生)

I always get the wrong response to the FIRST query result (it happens everytime i change my query)

我正在使用 nodejs 本机进行服务器端编程。 我在 server.js 上写了我的代码,如下所示:

const express = require('express');
const https = require('https');
const bodyParser = require('body-parser');

const app = express();//initialized app as an express app
app.use(bodyParser.urlencoded({extended:true}));
app.use("/public", express.static(__dirname + "/public"));

let newConfirmed = null;
let requestedCountryCode = null;

app.post("/", (req, res) => {
    let selectedCountry = req.body.searchInput;//used body-parser here
    ltBraceIndex = selectedCountry.indexOf('(');
    requestedCountryCode = selectedCountry.slice(ltBraceIndex+1, ltBraceIndex+3)//generating value of the requestedCountryCode variable

    //Get Covid details
    const covidUrl = "https://api.covid19api.com/summary"
    https.get(covidUrl, (response) => {    
        
        let chunks = [];
        response
            .on('data', (chunk)=>{
                chunks.push(chunk);
            })
            .on('end', ()=>{
                let data = Buffer.concat(chunks);
                let covidData = JSON.parse(data); 
                covidData.Countries.forEach(Object => {
                    if(Object.CountryCode === requestedCountryCode){
                        newConfirmed = Object.NewConfirmed;
                    }
                });
            })
            .on("error", (error) => {
                console.error(error);
            });
        
        console.log(newConfirmed);    
    })
});

我在下面的附图中说明了我的问题。 (参见 VS 代码终端)

1.img1: 我在搜索栏里输入了阿富汗

  1. img2: 我在搜索栏里输入了印度。

为什么会这样?请帮我解决这个问题。每次我更改查询时,我总是得到对第一个查询结果的错误响应(如上图中的终端所示)。

第一个请求在日志中给你 null 因为你这样声明 newConfirmed

let newConfirmed = null

现在,您可能会问,为什么它在您已经从 API 请求时使用该值?

这是因为你把console.log()放在了响应的end事件之外。

   response
        .on('data', (chunk)=>{
            chunks.push(chunk);
        })
        .on('end', ()=>{
            let data = Buffer.concat(chunks);
            let covidData = JSON.parse(data); 
            covidData.Countries.forEach(Object => {
                if(Object.CountryCode === requestedCountryCode){
                    newConfirmed = Object.NewConfirmed;
                }
            });
        })
        .on("error", (error) => {
            console.error(error);
        });
  
    console.log(newConfirmed);

这使得脚本在事件 end 被触发之前执行 console.log(),因此是旧值。

要更改此设置,您需要做的是将 console.log() 放入 end 事件中,以便它在数据真正准备好时记录。

   response
        .on('data', (chunk)=>{
            chunks.push(chunk);
        })
        .on('end', ()=>{
            let data = Buffer.concat(chunks);
            let covidData = JSON.parse(data); 
            covidData.Countries.forEach(Object => {
                if(Object.CountryCode === requestedCountryCode){
                    newConfirmed = Object.NewConfirmed;
                    console.log(newConfirmed);
                }
            });
        })
        .on("error", (error) => {
            console.error(error);
        });