在 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,我在标题中添加了PUT
:res.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的主要内容,如果未能解决你的问题,请参考以下文章