nodejs原生,express,koa跨域问题解决

来源:互联网 发布:淘宝商品被管控下架了 编辑:程序博客网 时间:2024/06/06 01:43

cll极客 发布在geekjc2016年11月28日view:277sideReact前端工程师跨域

在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。
隐藏标注
XMLHttpRequest cannot load http://localhost:3000/. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘null’ is therefore not allowed access.

上面是我学习nodejs中碰到的一个异常,下面有代码以及解决方案。

一、nodejs原生解决

1. js文件代码

var http=require('http');var querystring=require('querystring');http.createServer(function(req,res){  var postData='';  req.setEncoding('utf8');  req.on('data',function(chunk){    postData+=chunk;  });  req.on('end',function(){    res.end(postData+"hehe");  });}).listen(3000);console.log("服务启动。。。")

**

2. 前端html页面代码

**

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title></title><script src="jquery-1.8.3.js"></script><script type="text/javascript">$(function(){  $("#test").click(function(){    $.ajax({      'url':'http://localhost:3000',      'method':'POST',      'data':{},      'success':function(data){        console.log(data);      }    });  });})</script></head><body><p id="test">click me</p></body></html>

这是一个简单的ajax访问nodejs服务器demo,我的服务运行在windows10系统上。

win键+R 输入CMD 调出命令行工具,输入:node -v 查看是否安装了nodejs以及版本。

通过cd命令定位到js文件所在目录,输入:node js文件名 运行js文件

谷歌浏览器打开html文件点击click me然后按F12发现上文所说错误。

解决思路,百度一下发现是ajax跨域访问问题

在createServer方法里面第一行设置 res.setHeader(’Access-Control-Allow-Origin’, ’*’);

*号代表允许任何与的请求,当然实际生产环境不可能这么做。

你可以通过报错提示找到被拒绝的域然后设置res.setHeader(’Access-Control-Allow-Origin’, ’域名’);

比如我在Sublime Text里面打开html文件是这样设置res.setHeader(’Access-Control-Allow-Origin’, ’http://localhost:8020’);

在本地直接打开html文件可以这样子设置res.setHeader(’Access-Control-Allow-Origin’, ‘null’);

二、express解决

跨域问题主要在header上下功夫 首先提供一个w3c的header定义 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 再提供一个网友提供的header详解 http://kb.cnblogs.com/page/92320/

这两个有助于帮助大家理解header的类型和作用, 但是遗憾的是跨域相关的两个header属性我都没有找到相关的定义,

下面直接告诉大家:

1、是Access-Control-Allow-Origin 允许的域

2、是Access-Control-Allow-Headers 允许的header类型

第一项可以直接设为* 表示任意 但是第二项不能这样写,在chrome中测试跨域发现报错,

最终的代码看起来是这个样子:

app.all('*', function(req, res, next) {    res.header("Access-Control-Allow-Origin", "*");    res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");    res.header("X-Powered-By",' 3.2.1')    if(req.method=="OPTIONS") res.send(200);/*让options请求快速返回*/    else  next();});

代码完善:

//allow custom header and CORSapp.all('*',function (req, res, next) {  res.header('Access-Control-Allow-Origin', '*');  res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');  res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');  if (req.method == 'OPTIONS') {    res.send(200); /让options请求快速返回/  }  else {    next();  }});

参考:解决NodeJS+Express模块的跨域访问控制问题:Access-Control-Allow-Origin - 推酷

最后介绍一个cors模块,引入就可以解决了。代码如下:

var express = require('express')  , cors = require('cors')  , app = express();app.use(cors());app.get('/products/:id', function(req, res, next){  res.json({msg: 'This is CORS-enabled for all origins!'});});app.listen(80, function(){  console.log('CORS-enabled web server listening on port 80');});

express cors 模块链接expressjs/cors

三、koa解决

koa也有个cors模块.代码如下:

var koa = require('koa');var route = require('koa-route');var cors = require('koa-cors');var app = koa();app.use(cors());app.use(route.get('/', function() {  this.body = { msg: 'Hello World!' };}));app.listen(3000);
0 0