【发布时间】: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());
});
这是我的路由部分代码
不用担心令牌变量是只读的!
【问题讨论】:
-
你的
services函数没有return任何东西——只有promise 回调可以。添加另一个return以返回整个承诺链。或者,如果您已经将函数声明为async,则删除所有then()语法并使用await。 -
你没有对
services中的承诺做任何事情。return res.data;无处可去。你有一个async函数,但从不使用await。你实际上可以用return fetch(…)…;来返回承诺,尽管我不熟悉res.render是如何处理这个问题的。从其他回复来看,这似乎正是应该这样做的。 -
另外,请不要显示代码图像,只需将相关代码复制并粘贴到问题中即可。
标签: javascript node.js promise