我总是对第一个查询结果得到错误的响应(每次我更改查询时都会发生)
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: 我在搜索栏里输入了阿富汗
- 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);
});
我正在使用 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: 我在搜索栏里输入了阿富汗
- 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);
});