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

Javascript 我似乎无法返回我想要返回的正确对象,javascript,node.js,promise,Javascript,Node.js,Promise,我正在使用NodeJS和一些JS承诺尝试通过特定的web应用程序使用CMS。我正在尝试从CMSAPI获取一些数据,并且能够控制台.log()显示这些数据,它在控制台中显示得很好。虽然当我试图返回它时,它说对象是未定义的。我不确定我做错了什么。任何帮助都将不胜感激 module.exports = { services: async function(){ fetch( 'https://graphql.datocms.com/',

我正在使用NodeJS和一些JS承诺尝试通过特定的web应用程序使用CMS。我正在尝试从CMSAPI获取一些数据,并且能够控制台.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());
});
这是我的路由部分代码


不要担心令牌变量是只读的

服务
需要
返回
获取
。Fetch返回一个承诺,因此在调用render之前,应该在路由中处理承诺和响应

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 });
});
另外,有人提到只在服务函数中使用wait,这也是完全可行的

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 });
});

您的
服务
函数不会
返回
任何内容-只有promise回调才会返回。添加另一个
return
以返回整个承诺链。或者,如果您已经将函数声明为
async
,请删除所有
then()
语法并使用
wait
。您没有按照
服务中的承诺做任何事情。
返回res.data哪儿也去不了。您有一个
async
函数,但从不使用
wait
。实际上,您可以通过
返回fetch(
返回承诺
,但我不熟悉
res.render
如何处理这个问题。从其他回答来看,似乎这正是应该做的。可能的重复也请不要显示代码的图像,只需复制并粘贴相关的代码片段到问题中。