我试图在我的Node.js应用程序中支持使用Express.js Web框架的CORS . 我已阅读a Google group discussion关于如何处理这个问题,并阅读了一些关于CORS如何工作的文章 . 首先,我这样做了(代码是用CoffeeScript语法编写的):
app.options "*", (req, res) ->
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
# try: 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
# try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
它似乎不起作用 . 好像我的浏览器(Chrome)没有发送初始OPTIONS请求 . 当我刚刚更新资源块时,我需要将跨源GET请求提交到:
app.get "/somethingelse", (req, res) ->
# ...
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
它有效(在Chrome中) . 这也适用于Safari .
我读过......
在实现CORS的浏览器中,每个跨源GET或POST请求前面都有一个OPTIONS请求,用于检查GET或POST是否正常 .
所以我的主要问题是,为什么我的情况似乎没有发生?为什么我的app.options块没有被调用?为什么我需要在主app.get块中设置 Headers ?
22 回答
可以参考下面的代码相同 . 资料来源:Academind/node-restful-api
我们可以避免使用CORS并将请求转发给其他服务器:
做这样的事情:
除了其他人所说的,不要忘记,除非使用nodemon,否则您需要重新启动节点服务器才能使更改生效!
我个人一直习惯于刷新我的浏览器,忘记它是服务器端代码 .
使用Express Middleware对我来说很有用 . 如果您已经在使用Express,只需添加以下中间件规则即可 . 它应该开始工作 .
Reference
下面的代码可以使用,但首先安装cors:
npm install --save cors
然后:
尝试将控制权传递给下一个匹配的路线 . 如果Express首先匹配app.get路由,那么它将不会继续到选项路由,除非你这样做(注意使用next):
在组织CORS的方面,我把它放在一个适合我的中间件中:
在不同端口中使用快速节点离子运行进行测试 .
Localhost:8100
Localhost:5000
前段时间,我遇到了这个问题所以我这样做是为了在我的nodejs app中允许CORS:
首先,使用以下命令 need to install
cors
:现在 add the following code 到您的应用启动文件,如(
app.js or server.js
)要回答您的主要问题,如果POST或GET中包含任何非简单内容或 Headers ,则CORS规范仅要求OPTIONS调用在POST或GET之前 .
需要CORS飞行前请求(OPTIONS调用)的内容类型是除以下内容之外的任何内容类型:
application/x-www-form-urlencoded
multipart/form-data
text/plain
除上述内容之外的任何其他内容类型都将触发飞行前请求 .
至于 Headers ,除以下内容之外的任何请求 Headers 都会触发飞行前请求:
Accept
Accept-Language
Content-Language
Content-Type
DPR
Save-Data
Viewport-Width
Width
任何其他请求标头将触发飞行前请求 .
因此,您可以添加自定义标头,例如:
x-Trigger: CORS
,这应该触发飞行前请求并点击OPTIONS块 .见MDN Web API Reference - CORS Preflighted requests
在typescript中,如果你想使用node.js包cors
如果您不想使用第三方库来进行cors错误处理,则需要更改handleCORSErrors()方法 .
使用app.ts文件
我已经制作了一个更完整的中间件,适合快递或连接 . 它支持
OPTIONS
预检检查请求 . 请注意,它允许CORS访问任何内容,如果要限制访问,可能需要进行一些检查 .这对我来说很有用,因为它在路线中很容易实现,我使用meanjs和它的工作正常,safari,chrome等 .
我发现使用npm请求包(https://www.npmjs.com/package/request)非常容易
然后我将我的解决方案基于这篇文章http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/
首先只需在项目中安装cors . 将终端(命令提示符)和
cd
带到项目目录并运行以下命令:然后获取server.js文件并更改代码以在其中添加以下内容:
这对我有用..
安装expressjs的cors模块 . 你可以按照这些步骤>
Installation
Simple Usage (Enable All CORS Requests)
欲了解更多详情,请访问https://github.com/expressjs/cors
如果您想使控制器特定,您可以使用:
请注意,这也将允许iframe .
使用Express 4.2.0(编辑:似乎在4.3.0中不起作用)的最简单的解决方案是:
我想
app.all('/result', ...)
也会起作用......我发现最简单的方法是使用node.js包cors . 最简单的用法是:
当然,有很多方法可以根据您的需要配置行为;上面链接的页面显示了许多示例 .
我用了以下几个步骤网络应用程序,我取得了成功:
将cors包添加到express:
添加以下行 after the bodyParser configuration . 我在bodyParser之前添加了一些麻烦:
做
只需在您的主文件中添加这些行,您的请求将继续(在任何路由之前保留) .
保持路由的相同想法 . 我用这个代码:
与http://enable-cors.org/server_expressjs.html示例类似