在 Node.js 中允许 CORS 用于 PUT

Posted

技术标签:

【中文标题】在 Node.js 中允许 CORS 用于 PUT【英文标题】:Allow CORS for PUT in Node.js 【发布时间】:2017-07-16 18:04:13 【问题描述】:

我正在尝试对我的 rest api 端点进行 PUT 调用,并收到此错误:

Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

我使用此解决方案启用了CORS:enable-cors,它适用于POST

我如何为PUT 实现相同的目标?

谢谢。

【问题讨论】:

您是否阅读了错误信息? developer.mozilla.org/en-US/docs/Web/HTTP/… 您需要将 PUT(可能还有 OPTIONS)添加到 Access-Control-Allow-Methods 标头 感谢@SLaks 和Jaromanda,我在标题中添加了PUTres.header("Access-Control-Allow-Methods", "PUT");。它奏效了。 您还必须在服务器上支持 OPTIONS 方法,因为当客户端用户 PUT 时,浏览器将首先使用 OPTIONS 请求预先发送请求,并且只有在浏览器获得正确结果的情况下它会允许 PUT。 @jfriend00:不; OPTIONS 是协议的一部分,不需要在标头中单独输入。 【参考方案1】:

添加这个:

res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');

app.use(function(req, res, next) 
       res.header("Access-Control-Allow-Origin", "*");
       res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
       res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
          next();
    );

【讨论】:

感谢您提供此信息。我对我的代码有点困惑。现在它得到了修复。【参考方案2】:

您需要在您的服务器上支持 OPTIONS 方法,因为无论您有什么标头,浏览器都会预先发送所有跨域 PUT 请求。而且,您需要确保在 CORS 标头中明确允许 PUT。从MDN's page on CORS看到这个:

此外,对于可能对服务器数据造成副作用的 HTTP 请求方法(特别是对于 GET 以外的 HTTP 方法,或用于某些 MIME 类型的 POST),规范要求浏览器“预检”请求,使用 HTTP OPTIONS 请求方法从服务器请求支持的方法,然后在服务器“批准”后,使用实际的 HTTP 请求方法发送实际请求。服务器还可以通知客户端是否应将“凭据”(包括 Cookie 和 HTTP 身份验证数据)与请求一起发送。

因此,在您的服务器中,您需要执行以下操作:

app.use(function(req, res, next) 
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
    // allow preflight
    if (req.method === 'OPTIONS') 
        res.send(200);
     else 
        next();
    
);

这是一篇关于该主题的文章:

Cross-Origin Requests in Express.JS

【讨论】:

以上是关于在 Node.js 中允许 CORS 用于 PUT的主要内容,如果未能解决你的问题,请参考以下文章

如何在无服务器中允许 CORS 用于自定义标头?

路径不适用于 Blazor 中允许的 IdentityServer CORS 端点,但适用于 Postman

在 Flask 中允许 CORS

如何在 NodeJS 14 中允许 CORS

在 Ruby on Rails 中允许 CORS

node.js中允许的app对象声明方式