在 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 草稿。
所以我认为这与您最初的问题不同。