尝试使用 11ty 从 Strapi 获取 post 数据时收到 403 错误
Receiving a 403 error when trying to post data from Strapi using 11ty
目标
我正在尝试从 strapi API http://localhost:1337/articles 检索数据,但是当我尝试 运行 一个 11ty 构建时,我收到控制台错误(可以见下文)。
我试过的
我试着看看是否有其他人遇到过同样的问题,但我似乎找不到任何东西。我还查看了其他人的 strapi 和 11ty 设置,看看我的一般设置是否有问题,一切似乎都很好。这个问题似乎是基于我的 blogposts.js 文件和 strapi 数据之间的连接。
文件正在用于 post 数据 (blogposts.js)
const fetch = require("node-fetch");
// function to get blogposts
async function getAllBlogposts() {
// max number of records to fetch per query
const recordsPerQuery = 100;
// number of records to skip (start at 0)
let recordsToSkip = 0;
let makeNewQuery = true;
let blogposts = [];
// make queries until makeNewQuery is set to false
while (makeNewQuery) {
try {
// initiate fetch
const data = await fetch("http://localhost:1337/articles", {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify({
query: `{
articles {
id
Title
Content
published_at
Cover
Slug
}
}`,
}),
});
// store the JSON response when promise resolves
const response = await data.json();
// handle CMS errors
if (response.errors) {
let errors = response.errors;
errors.map((error) => {
console.log(error.message);
});
throw new Error("Houston... We have a CMS problem");
}
// update blogpost array with the data from the JSON response
blogposts = blogposts.concat(response.data.articles);
// prepare for next query
recordsToSkip += recordsPerQuery;
// stop querying if we are getting back less than the records we fetch per query
if (response.data.articles.length < recordsPerQuery) {
makeNewQuery = false;
}
} catch (error) {
throw new Error(error);
}
}
// format blogposts objects
const blogpostsFormatted = blogposts.map((item) => {
return {
id: item.id,
title: item.Title,
slug: item.Slug,
body: item.Content,
cover: item.Cover,
date: item.published_at
};
});
// return formatted blogposts
return blogpostsFormatted;
}
// export for 11ty
module.exports = getAllBlogposts
运行ning npm
后出现控制台错误
> TypeError: Cannot read property 'articles' of undefined
`Error` was thrown:
Error: TypeError: Cannot read property 'articles' of undefined
at getAllBlogposts (C:\Users\Kaleshe\kaleshe.github.io\_data\blogposts.js:62:19)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at async TemplateData.getDataValue (C:\Users\Kaleshe\AppData\Roaming\npm-cache\_npx352\node_modules\@11ty\eleventy\src\TemplateData.js:385:23)
at async TemplateData.getAllGlobalData (C:\Users\Kaleshe\AppData\Roaming\npm-cache\_npx352\node_modules\@11ty\eleventy\src\TemplateData.js:228:18)
at async TemplateData.getData (C:\Users\Kaleshe\AppData\Roaming\npm-cache\_npx352\node_modules\@11ty\eleventy\src\TemplateData.js:255:24)
Strapi 控制台错误消息
debug POST /articles (9 ms) 403
解释:
嗯403
错误响应码对应403 - Forbidden
。这意味着您尝试访问的路由根本不允许您的用户角色访问。
现在,查看您的请求调用,很明显您不是经过身份验证的用户,因为您没有在 api 请求上附加任何 bearer
令牌。它表明您可能正在尝试访问 public api。但不幸的是,它在 strapi
设置中没有标记为 public。
解决方案:
要使其正常工作,您需要为 public 角色允许此 api。您可以通过访问 user-permissions
模块并编辑 public
角色的权限来完成此操作。
http://localhost:1337/admin/settings/users-permissions/roles
UI接口:
您应该会看到如下所示的界面,您可以在其中勾选您需要制作的 apis
public。
参考:
目标
我正在尝试从 strapi API http://localhost:1337/articles 检索数据,但是当我尝试 运行 一个 11ty 构建时,我收到控制台错误(可以见下文)。
我试过的
我试着看看是否有其他人遇到过同样的问题,但我似乎找不到任何东西。我还查看了其他人的 strapi 和 11ty 设置,看看我的一般设置是否有问题,一切似乎都很好。这个问题似乎是基于我的 blogposts.js 文件和 strapi 数据之间的连接。
文件正在用于 post 数据 (blogposts.js)
const fetch = require("node-fetch");
// function to get blogposts
async function getAllBlogposts() {
// max number of records to fetch per query
const recordsPerQuery = 100;
// number of records to skip (start at 0)
let recordsToSkip = 0;
let makeNewQuery = true;
let blogposts = [];
// make queries until makeNewQuery is set to false
while (makeNewQuery) {
try {
// initiate fetch
const data = await fetch("http://localhost:1337/articles", {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify({
query: `{
articles {
id
Title
Content
published_at
Cover
Slug
}
}`,
}),
});
// store the JSON response when promise resolves
const response = await data.json();
// handle CMS errors
if (response.errors) {
let errors = response.errors;
errors.map((error) => {
console.log(error.message);
});
throw new Error("Houston... We have a CMS problem");
}
// update blogpost array with the data from the JSON response
blogposts = blogposts.concat(response.data.articles);
// prepare for next query
recordsToSkip += recordsPerQuery;
// stop querying if we are getting back less than the records we fetch per query
if (response.data.articles.length < recordsPerQuery) {
makeNewQuery = false;
}
} catch (error) {
throw new Error(error);
}
}
// format blogposts objects
const blogpostsFormatted = blogposts.map((item) => {
return {
id: item.id,
title: item.Title,
slug: item.Slug,
body: item.Content,
cover: item.Cover,
date: item.published_at
};
});
// return formatted blogposts
return blogpostsFormatted;
}
// export for 11ty
module.exports = getAllBlogposts
运行ning npm
后出现控制台错误> TypeError: Cannot read property 'articles' of undefined
`Error` was thrown:
Error: TypeError: Cannot read property 'articles' of undefined
at getAllBlogposts (C:\Users\Kaleshe\kaleshe.github.io\_data\blogposts.js:62:19)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at async TemplateData.getDataValue (C:\Users\Kaleshe\AppData\Roaming\npm-cache\_npx352\node_modules\@11ty\eleventy\src\TemplateData.js:385:23)
at async TemplateData.getAllGlobalData (C:\Users\Kaleshe\AppData\Roaming\npm-cache\_npx352\node_modules\@11ty\eleventy\src\TemplateData.js:228:18)
at async TemplateData.getData (C:\Users\Kaleshe\AppData\Roaming\npm-cache\_npx352\node_modules\@11ty\eleventy\src\TemplateData.js:255:24)
Strapi 控制台错误消息
debug POST /articles (9 ms) 403
解释:
嗯403
错误响应码对应403 - Forbidden
。这意味着您尝试访问的路由根本不允许您的用户角色访问。
现在,查看您的请求调用,很明显您不是经过身份验证的用户,因为您没有在 api 请求上附加任何 bearer
令牌。它表明您可能正在尝试访问 public api。但不幸的是,它在 strapi
设置中没有标记为 public。
解决方案:
要使其正常工作,您需要为 public 角色允许此 api。您可以通过访问 user-permissions
模块并编辑 public
角色的权限来完成此操作。
http://localhost:1337/admin/settings/users-permissions/roles
UI接口:
您应该会看到如下所示的界面,您可以在其中勾选您需要制作的 apis
public。