最近在使用react+node.js做项目时遇到一个问题:前端需要的内容向服务器发送的是json格式(即content-type为application/json格式),使用fetch()与服务器交互时,headers中的content-type设置为application/json,数据不能被发送到服务器报错如下:我明明用的是post方式!但是尝试了很多方法,在headers中添加mode:'no-cors'(意思是“不跨域”)后,提交成功,但是查看请求的headers发现content-type自动变为text-plain,这不是服务器期望接收的数据格式。后来gooooooooogle在stackoverflow上看到这个回答:大概意思是:在'no-cors'模式下,我们不能修改content-type,content-type的值只能是application/x-www-form-urlencoded、multipart/form-data或text/plain。如果不设置mode,直接设置content-type为application/json,那么fetch会默认跨域模式(mode:'cors')。在跨域POST之前,客户端会先向“探路”发送OPTIONS请求,如果服务器允许,则继续POST数据。对于这种OPTIONS请求,需要在服务器配置中允许OPTIONS请求被接受。我的配置是这样的:if(ctx.request.method=="OPTIONS"){ctx.response.status=200}我直接这样写是为了允许所有的OPTIONS请求,你也可以判断OPTIONS请求中更详细的信息根据您的需要。当然,如果你的项目确实涉及跨域问题,除了判断OPTIONS方法的请求外,还需要配置请求头。我的node.js项目中配置如下(使用KOA2框架):app.use(async(ctx,next)=>{ctx.set("Access-Control-Allow-Origin","*");ctx.set("Access-Control-Allow-Credentials",true);ctx.set("Access-Control-Allow-Methods","OPTIONS,GET,PUT,POST,DELETE");ctx.set("Access-Control-Allow-Headers","x-requested-with,accept,origin,content-type");ctx.set("X-Powered-By",'3.2.1')??;ctx.set("内容-Type","application/json;charset=utf-8");if(ctx.request.method=="OPTIONS"){ctx.response.status=200}}awaitnext();});这样前端就不需要做跨域处理了。新手在路上,理解有误请指正~==============2017.6.16更新===================================================================================================header配置中的header字段必须和fetch中设置的header字段一致,对于示例:在nodejs中配置头文件:ctx.set("Access-Control-Allow-Headers","x-requested-with,accept,origin,content-type");然后,fetch中的content-type配置也要和上面的代码一样写。content-type用nodejs写,content-type用fetch写。不允许写contentType,会被拒绝。
