我正在使用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());
});
这是我的代码路由部分
别担心,令牌变量是只读的!
答案 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 });
});