javascript - 我总是对第一个查询结果做出错误的响应(每次我更改查询时都会发生这种情况)
问题描述
我正在使用 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。
为什么会这样?请帮我解决这个问题。每次我更改查询时,我总是得到对第一个查询结果的响应错误(如上图中的终端所示)。
解决方案
第一个请求会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);
});
推荐阅读
- typescript - 为什么不能使用 lambda 构造将方法订阅到数据表的单击事件?
- google-chrome - vscode chrome调试器启动启动配置中的webRoot是什么?
- reactjs - JSX 没有返回任何东西
- openshift - 是否可以仅在 Openshift Master 上禁用 CNI?
- angular - 无法在 Mangaeden API Angular 6 中获取图像 url
- .htaccess - .htaccess Url 重写和重定向
- oracle - PL/SQL Developer 测试脚本在执行模式下失败,在调试模式下通过
- html - XPath 选择不只有一个特定子节点的节点?
- css - 关于背景和 calc() 的一个小问题
- angular - 订阅方法的错误回调未在 angular4 中触发