【问题标题】:I cant seem to return the correct object that I want returned我似乎无法返回我想要返回的正确对象
【发布时间】:2019-10-10 03:07:43
【问题描述】:

我正在使用 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

不用担心令牌变量是只读的!

【问题讨论】:

  • 你的services 函数没有return 任何东西——只有promise 回调可以。添加另一个 return 以返回整个承诺链。或者,如果您已经将函数声明为 async,则删除所有 then() 语法并使用 await
  • 你没有对services 中的承诺做任何事情。 return res.data; 无处可去。你有一个async 函数,但从不使用await。你实际上可以用return fetch(); 来返回承诺,尽管我不熟悉res.render 是如何处理这个问题的。从其他回复来看,这似乎正是应该这样做的。
  • 另外,请不要显示代码图像,只需将相关代码复制并粘贴到问题中即可。

标签: javascript node.js promise


【解决方案1】:

services 需要return fetch。 Fetch 返回一个 Promise,因此处理 Promise 和响应应该在调用 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 });
});

另外,有人提到只是在你的服务函数中使用 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 });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多