在 Next.js 中从 CMS 访问 api
Access api from a CMS in Next.js
我正在尝试从 node.js 中的无头 cms 代理访问 next.js 中的端点,但我无法让它工作。我想将我重定向到一个站点,但我收到以下错误:
For help, see: https://nodejs.org/en/docs/inspector (node:8549)
UnhandledPromiseRejectionWarning: Error: Request failed with status
code 500
at createError (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/createError.js:16:15)
at settle (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/adapters/http.js:236:11)
at IncomingMessage.emit (events.js:322:22)
at endReadableNT (_stream_readable.js:1187:12)
at processTicksAndRejections (internal/process/task_queues.js:84:21) (node:8549)
UnhandledPromiseRejectionWarning: Unhandled promise rejection. This
error originated either by throwing inside of an async function
without a catch block, or by rejecting a promise which was not handled
with .catch(). To terminate the node process on unhandled promise
rejection, use the CLI flag --unhandled-rejections=strict
(see
https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode).
(rejection id: 2) (node:8549) [DEP0018] DeprecationWarning: Unhandled
promise rejections are deprecated. In the future, promise rejections
that are not handled will terminate the Node.js process with a
non-zero exit code. (node:8549) UnhandledPromiseRejectionWarning:
Error: Request failed with status code 500
at createError (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/createError.js:16:15)
at settle (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/adapters/http.js:236:11)
at IncomingMessage.emit (events.js:322:22)
at endReadableNT (_stream_readable.js:1187:12)
at processTicksAndRejections (internal/process/task_queues.js:84:21) (node:8549)
UnhandledPromiseRejectionWarning: Unhandled promise rejection. This
error originated either by throwing inside of an async function
without a catch block, or by rejecting a promise which was not handled
with .catch(). To terminate the node process on unhandled promise
rejection, use the CLI flag --unhandled-rejections=strict
(see
https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode).
(rejection id: 4)
代理服务器localhost:4000
app.get("/test", (req, r, next) => {
Axios.get('http://localhost:3000/api/hello').then((res)=>{
})
});
Next.js端点hello.jslocalhost:3000
export default (req, res) => {
res.statusCode = 200;
res.redirect('https://youtube.com');
};
将您的代码放在 try/catch
块中,您可能会收到此错误:res.redirect 不是函数。你用的是哪个版本的next?您确定您的版本支持 redirect 响应助手吗? (我认为仅在最新版本 - 9.5 中可用)
顺便说一下,您应该仍然可以使用 writeHead
:
res.writeHead(302, {
Location: "https://youtube.com",
})
res.end()
编辑
如果你想在你的代理中重定向,你可以这样做:
Next.js端点hello.jslocalhost:3000
export default (req, res) => {
res.json({url : "www.youtube.com"})
};
代理服务器localhost:4000
app.get("/test", (req,res) => {
Axios.get('http://localhost:3000/api/hello').then((result)=>{
let {url} = result
if(url){
res.redirect(url)
}
})
});
编辑2
我从未使用过预览模式,但据我了解,预览模式只是一种实用程序,用于覆盖静态生成并在请求时而不是构建时从您的 cms 获取数据,而不是代理服务器。
您在无头 cms 中创建新 post 的图像,您想预览您的新博客 post 但接下来将仅在构建时获取该数据,使用预览模式您可以覆盖它并获得预览您的 post 因此页面将在请求时呈现。
您可以看到预览访问预览 url,或者在 iframe 中嵌入 url(我猜)。
请注意,只有当您 pre-render 您的页面带有 getStaticProps
.
时,这才有意义
使用 getServerSideProps
你不需要任何预览(你已经在每次请求时获取数据),但是你的访问者每次都会获取内容并且并不是真的有必要,所以你可以使用 getStaticProps
和预览 api 仅用于在发布前查看您的 post 草稿。
所以我认为这与您最初的问题不同。
我正在尝试从 node.js 中的无头 cms 代理访问 next.js 中的端点,但我无法让它工作。我想将我重定向到一个站点,但我收到以下错误:
For help, see: https://nodejs.org/en/docs/inspector (node:8549) UnhandledPromiseRejectionWarning: Error: Request failed with status code 500 at createError (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/createError.js:16:15) at settle (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/settle.js:17:12) at IncomingMessage.handleStreamEnd (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/adapters/http.js:236:11) at IncomingMessage.emit (events.js:322:22) at endReadableNT (_stream_readable.js:1187:12) at processTicksAndRejections (internal/process/task_queues.js:84:21) (node:8549) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag
--unhandled-rejections=strict
(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2) (node:8549) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. (node:8549) UnhandledPromiseRejectionWarning: Error: Request failed with status code 500 at createError (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/createError.js:16:15) at settle (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/core/settle.js:17:12) at IncomingMessage.handleStreamEnd (/home/george/Documents/Coding/NodeJs/node-server/node_modules/axios/lib/adapters/http.js:236:11) at IncomingMessage.emit (events.js:322:22) at endReadableNT (_stream_readable.js:1187:12) at processTicksAndRejections (internal/process/task_queues.js:84:21) (node:8549) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag--unhandled-rejections=strict
(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 4)
代理服务器localhost:4000
app.get("/test", (req, r, next) => {
Axios.get('http://localhost:3000/api/hello').then((res)=>{
})
});
Next.js端点hello.jslocalhost:3000
export default (req, res) => {
res.statusCode = 200;
res.redirect('https://youtube.com');
};
将您的代码放在 try/catch
块中,您可能会收到此错误:res.redirect 不是函数。你用的是哪个版本的next?您确定您的版本支持 redirect 响应助手吗? (我认为仅在最新版本 - 9.5 中可用)
顺便说一下,您应该仍然可以使用 writeHead
:
res.writeHead(302, {
Location: "https://youtube.com",
})
res.end()
编辑
如果你想在你的代理中重定向,你可以这样做:
Next.js端点hello.jslocalhost:3000
export default (req, res) => {
res.json({url : "www.youtube.com"})
};
代理服务器localhost:4000
app.get("/test", (req,res) => {
Axios.get('http://localhost:3000/api/hello').then((result)=>{
let {url} = result
if(url){
res.redirect(url)
}
})
});
编辑2
我从未使用过预览模式,但据我了解,预览模式只是一种实用程序,用于覆盖静态生成并在请求时而不是构建时从您的 cms 获取数据,而不是代理服务器。
您在无头 cms 中创建新 post 的图像,您想预览您的新博客 post 但接下来将仅在构建时获取该数据,使用预览模式您可以覆盖它并获得预览您的 post 因此页面将在请求时呈现。
您可以看到预览访问预览 url,或者在 iframe 中嵌入 url(我猜)。
请注意,只有当您 pre-render 您的页面带有 getStaticProps
.
时,这才有意义
使用 getServerSideProps
你不需要任何预览(你已经在每次请求时获取数据),但是你的访问者每次都会获取内容并且并不是真的有必要,所以你可以使用 getStaticProps
和预览 api 仅用于在发布前查看您的 post 草稿。
所以我认为这与您最初的问题不同。