Node.js NextJS定制服务器在使用';构建后出现CORS错误;npm运行构建';

Node.js NextJS定制服务器在使用';构建后出现CORS错误;npm运行构建';,node.js,build,axios,cors,next.js,Node.js,Build,Axios,Cors,Next.js,这很好用。我使用npm run dev启动这个定制服务器(下面是server.js代码)。我需要使用服务器端渲染进行生产构建,无法使用下一次导出 在我运行npm run build后,身份验证不起作用。我发现后端服务器没有接收Cookie。所以我在axios请求中添加了,withCredentials:true。但是所有请求都被cors策略阻止了。错误消息是 已阻止跨源请求:同源策略不允许读取位于的远程资源http://localhost:5002/api/v1/users/authentica

这很好用。我使用npm run dev启动这个定制服务器(下面是server.js代码)。我需要使用服务器端渲染进行生产构建,无法使用下一次导出

在我运行npm run build后,身份验证不起作用。我发现后端服务器没有接收Cookie。所以我在axios请求中添加了,
withCredentials:true
。但是所有请求都被cors策略阻止了。错误消息是

已阻止跨源请求:同源策略不允许读取位于的远程资源http://localhost:5002/api/v1/users/authenticate’. (原因:如果CORS标头“Access Control Allow Origin”为“*”,则不支持凭据)

我在后端nodejs express服务器中使用cors包

我尝试了所有的互联网解决方案。允许客户端和服务器上的cors源,使用cors选项将localhost作为源。但这一切都不管用

下面是nextjs自定义服务器代码

const express = require('express');
const next = require('next');
const { createProxyMiddleware } = require('http-proxy-middleware');

const port = 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

const apiPaths = {
  '/api': {
    target: 'http://localhost:5002',
    pathRewrite: {
      '^/api': '/api',
    },
    changeOrigin: true,
  },
};

const isDevelopment = process.env.NODE_ENV !== 'production';

app
  .prepare()
  .then(() => {
    const server = express();

    if (isDevelopment) {
      server.use('/api', createProxyMiddleware(apiPaths['/api']));
    }

    server.all('*', (req, res) => {
      return handle(req, res);
    });

    server.listen(port, (err) => {
      if (err) throw err;
      console.log(`> Ready on http://localhost:${port}`);
    });
  })
  .catch((err) => {
    console.log('Error:::::', err);
  });

使用Axios的客户端代码

        const token = localStorage.getItem('token');

        if (token) {

          const data = await axios({
            method: 'post',
            url: `${process.env.NEXT_PUBLIC_API}/api/v1/users/authenticate`,

            withCredentials: true,
            data: { token },
          });

您需要将cors库添加到Express API中。它允许您从API运行cors请求

安装cors,然后使用添加中间件

const cors=require(“cors”);
app.use(cors())

您的CORS规则可以自定义ofc。使用上面的代码,您基本上允许来自任何来源的所有CORS请求。

如果您查看错误

同一来源策略不允许读取位于的远程资源 ‘http://localhost:5002/api/v1/users/authenticate’. (理由:证书 如果CORS标头“Access Control Allow Origin”为 “*”)

它说的是:当您将凭证包含在请求中时,
withCredentials:true,
,原点不能是“*”,这是使用
cors()时的默认选项。
。您可以在cors选项中指定请求的来源。您还需要添加“凭据”选项来传递标头

const corsOptions = {
       origin : "YOUR_FRONTEND", // the origin of the requests - frontend address
       credentials : true  
}
然后:

app.use('/api/', cors(corsOptions)); 
app.options('*', cors(corsOptions));

已经在使用cors了。但是我发现了问题,我使用了process.env中的后端api链接。当我在axios中只使用相对url时,它就工作了。但是现在,如何将下一个生产构建代理到后端(如开发服务器)?能否添加在后端配置CORS的代码?@engkhoaĐinh//enable proxy app.enable('trust-proxy')//cors app.use('/api/',cors());app.options('*',cors());这是我的后端cors。