JS 节点获取无法从获取承诺中获取数据
JS node-fetch can't get data from a fetch promise
我想通过节点获取从维基百科api获取数据。
不幸的是,我无法在我的 fetch-Promise-Chain 之外设置变量。我想将此变量传递给渲染页面以填写表格。如果我 consle.log 在 fetch() 内部,一切都按我预期的那样工作。
我是新手,我承认我不了解 promises 的工作原理或如何练习这个主题。
const fetch = require('node-fetch');
exports.search = (req,res) =>{
console.log('going to search...' + req.query.eventSearchbar);
let searchterm = req.query.eventSearchbar;
let wikiDescription = 'Test';
const wikiAPI = "https://en.wikipedia.org/w/api.php";
let searchURL = new URL(wikiAPI)
searchURL += "?origin=*&action=query&list=search&srlimit=1&format=json&srprop=snippet&srsearch=";
searchURL += encodeURIComponent(req.query.eventSearchbar);
console.log(searchURL);
fetch(searchURL)
.then(res => res.json())
.then(json => json.query.search)
.then(array => array[0].snippet)
.then(snippet => {
wikiDescription = snippet;
})
.catch(err => console.log(err))
res.render('search',{searchterm: searchterm, wikiDescription: wikiDescription });
}
您需要等待提取才能按预期工作。
当你的JS代码通过网络Ajax请求从服务器获取数据时,你需要在函数中设置响应代码(也称为回调)。JS引擎基本告诉托管环境他暂时要暂停执行,当网络响应返回时,请告诉我并执行该回调函数。
因此,在您的示例中,您正在通过获取发出异步请求。响应会在您做出响应后的某个时间得到,但如果您不等待该呼叫,
res.render('search',{searchterm: searchterm, wikiDescription: wikiDescription });
肯定会在你得到结果之前发生。
最终结果:
exports.search = async (req,res) =>{
console.log('going to search...' + req.query.eventSearchbar);
/**
* let's build our search query for basic pageinformation
*/
let searchterm = req.query.eventSearchbar;
let wikiDescription = 'Test';
// where we are going to look...
const wikiAPI = "https://en.wikipedia.org/w/api.php";
// let's build aóur search url
let searchURL = new URL(wikiAPI)
searchURL += "?origin=*&action=query&list=search&srlimit=1&format=json&srprop=snippet&srsearch=";
searchURL += encodeURIComponent(req.query.eventSearchbar);
console.log(searchURL);
//fetch some data from wikipedia
await fetch(searchURL)
.then(res => res.json())
.then(json => json.query.search)
.then(array => array[0].snippet)
.then(snippet => {
wikiDescription = snippet;
})
.catch(err => console.log(err))
res.render('search',{searchterm: searchterm, wikiDescription: wikiDescription });
}
我想通过节点获取从维基百科api获取数据。 不幸的是,我无法在我的 fetch-Promise-Chain 之外设置变量。我想将此变量传递给渲染页面以填写表格。如果我 consle.log 在 fetch() 内部,一切都按我预期的那样工作。
我是新手,我承认我不了解 promises 的工作原理或如何练习这个主题。
const fetch = require('node-fetch');
exports.search = (req,res) =>{
console.log('going to search...' + req.query.eventSearchbar);
let searchterm = req.query.eventSearchbar;
let wikiDescription = 'Test';
const wikiAPI = "https://en.wikipedia.org/w/api.php";
let searchURL = new URL(wikiAPI)
searchURL += "?origin=*&action=query&list=search&srlimit=1&format=json&srprop=snippet&srsearch=";
searchURL += encodeURIComponent(req.query.eventSearchbar);
console.log(searchURL);
fetch(searchURL)
.then(res => res.json())
.then(json => json.query.search)
.then(array => array[0].snippet)
.then(snippet => {
wikiDescription = snippet;
})
.catch(err => console.log(err))
res.render('search',{searchterm: searchterm, wikiDescription: wikiDescription });
}
您需要等待提取才能按预期工作。
当你的JS代码通过网络Ajax请求从服务器获取数据时,你需要在函数中设置响应代码(也称为回调)。JS引擎基本告诉托管环境他暂时要暂停执行,当网络响应返回时,请告诉我并执行该回调函数。
因此,在您的示例中,您正在通过获取发出异步请求。响应会在您做出响应后的某个时间得到,但如果您不等待该呼叫,
res.render('search',{searchterm: searchterm, wikiDescription: wikiDescription });
肯定会在你得到结果之前发生。
最终结果:
exports.search = async (req,res) =>{
console.log('going to search...' + req.query.eventSearchbar);
/**
* let's build our search query for basic pageinformation
*/
let searchterm = req.query.eventSearchbar;
let wikiDescription = 'Test';
// where we are going to look...
const wikiAPI = "https://en.wikipedia.org/w/api.php";
// let's build aóur search url
let searchURL = new URL(wikiAPI)
searchURL += "?origin=*&action=query&list=search&srlimit=1&format=json&srprop=snippet&srsearch=";
searchURL += encodeURIComponent(req.query.eventSearchbar);
console.log(searchURL);
//fetch some data from wikipedia
await fetch(searchURL)
.then(res => res.json())
.then(json => json.query.search)
.then(array => array[0].snippet)
.then(snippet => {
wikiDescription = snippet;
})
.catch(err => console.log(err))
res.render('search',{searchterm: searchterm, wikiDescription: wikiDescription });
}