我似乎无法返回想要返回的正确对象

时间:2019-10-09 18:51:02

标签: javascript node.js promise

我正在使用NodeJS,一些JS承诺会尝试通过特定的Web应用程序使用CMS。我试图从CMS API中获取一些数据,并能够console.log()数据,并且它可以很好地显示在控制台中。尽管当我尝试返回它时,它说该对象是未定义的。我不确定自己在做什么错。任何帮助将不胜感激!

module.exports = {

    services: async function(){

        fetch(
          'https://graphql.datocms.com/',
          {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
              'Accept': 'application/json',
              'Authorization': `Bearer ${token}`,
            },
            body: JSON.stringify({
              query: `{
                            service {
                                serviceName
                                serviceImg {
                                    url
                                }
                            }
                        }`
            }),
          }
        )
        .then(res => res.json())
        .then((res) => {
          return res.data;
        })
        .catch((error) => {
          console.log(error);
        });
    },  
}

就像我说的那样,当我执行“ console.log(res.data)”时,它表示未定义。

const records = require('../public/records');

//root route
router.get('/', async (req, res) => {
    res.render("landing", {serviceRecord: records.services()});
    console.log(records.services());
});

这是我的代码路由部分

function returning object

How I am using it in index.js

别担心,令牌变量是只读的!

1 个答案:

答案 0 :(得分:-1)

services需要return fetch。提取会返回一个承诺,因此在调用渲染之前,应在您的路由中处理承诺和响应。

module.exports = {
    services: () => fetch( /* your fetch code */)
}

// Then in your routes...
router.get('/', async (req, res) => {
    const resp = await records.services()
    const serviceRecord = await resp.json()
    res.render("landing", { serviceRecord });
});

另外,有人提到只是在服务功能中使用await,这也是完全可行的。

module.exports = {
    services: async () => {
        const response = await fetch( /* your fetch code */)
        return await response.json()
    }

}

// Then in your routes...
router.get('/', async (req, res) => {
    const serviceRecord = await records.services()
    res.render("landing", { serviceRecord });
});