Return 来自 axios 的数据,以便通过车把将其显示在屏幕上

Return data from axios in order to display it on screen through handlebars

我有基本的 Node Js 应用程序,我想在其中显示给定位置的天气我有这个 post 路由,它正在渲染带有给定对象的天气页面:

                 app.post("/weather",(req,res)=>{
                     res.render('weather.hbs',{
                     temperature:fetchLocation(req.body.location),
                     location:req.body.location
                   });
                 });

我还有 fetchLocation 函数,它使用 axios 从 api

获取数据
                     function fetchLocation(location){
                       const encodedLocation = encodeURIComponent(location);
                       const url = `https://api.openweathermap.org/data/2.5/weather? 
                      q=${encodedLocation}&units=metric&appid=ID`;
                      return axios.get(url)
                      .then(response=>{
                          response.data.main.temp;
                        })
                        .catch(error=>{
                           console.log(error.message);
                          });
                          }

我无法从 axios 获取数据,它正在返回 undefiend 或 Promise pending

您需要使用 return 语句来 return 来自像这样的承诺的值

您还应该等待结果才能发回。您可以使用 async/await 或在收到数据后调用 res.render() 函数轻松实现,如下所示:

fetchLocation().then(data => res.render({ ... })
                     function fetchLocation(location){
                       const encodedLocation = encodeURIComponent(location);
                       const url = `https://api.openweathermap.org/data/2.5/weather? 
                      q=${encodedLocation}&units=metric&appid=ID`;
                      return axios.get(url)
                      .then(response=>{
-------------------------->  return response.data.main.temp;
                        })
                        .catch(error=>{
                           console.log(error.message);
                          });
                          }

// with async / await
     app.post("/weather",async (req,res)=>{
                     res.render('weather.hbs',{
                     temperature: await fetchLocation(req.body.location),
                     location:req.body.location
                   });
                 });

// OR without

     app.post("/weather",(req,res)=>{
fetchLocation(req.body.location).then(data => {
res.render('weather.hbs',{
                     temperature: data,
                     location:req.body.location
                   });
})
                 });