IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    shendao发表于 2017-03-02 01:52:47
    love 0
    nodejs原生,express,koa跨域问题解决

    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 CORS 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 , 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);

    koa-cors模块:koa-cors

    原文地址:nodejs原生,express,koa跨域问题解决



沪ICP备19023445号-2号
友情链接