首页 > 解决方案 > 我总是对第一个查询结果做出错误的响应(每次我更改查询时都会发生这种情况)

问题描述

我正在使用 nodejs native 进行服务器端编程。我在 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 Code 终端)

1.img1:我在搜索栏输入了afghanistan。

在此处输入图像描述

  1. img2:我在搜索栏中输入了印度。 在此处输入图像描述

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

标签: javascriptnode.jsexpressserverside-javascriptnodejs-server

解决方案


第一个请求会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);

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

你需要做的改变是把事件放在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);
        });
  
    

推荐阅读