如何在节点js上启用CORS?

时间:2016-11-05 04:49:39

标签: angularjs node.js socket.io cors

我遇到了一个我不太懂的问题。我有一个服务器简单node js页面的index.html服务器(这实际上是有角度的)。我的服务器代码如下所示:

var express = require('express');
var app = express();
var cors = require('cors')
var port = 4000;
var path    = require("path");
var bodyParser = require('body-parser'); 
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

app.use(express.static('.'))
console.log(__dirname + '/.');

app.use(cors({
  origin: true,
  credentials: true
}));



app.get("/", function(res, req){
  req.sendFile(path.join('/index.html'));
});


app.listen(port,'0.0.0.0' , function(){                                                                                                                                
  console.log("listening on * "+ port);
});

我的html页面,我有访问localhost:7000和访问socket.io的{​​{1}}和localhost:7000的angularjs服务。 我的服务看起来像这样:

if(param){
  $scope.isloading  = true;
  $http.post(
    'http://' + $location.host() +  ':7000/container', 
    { "method": "start", "nomber": param } , 
    {}
    ).then(function(err, data){
    console.log("No error : ");
    console.log(data);
    if (err){
      console.log(err);
    }
    $scope.isloading  = false;
    console.log("end Loading"  + $scope.isloading);
    }, function(err, data){
    $scope.isloading  = false;
    console.log("error  ");
   });
}

和socket.io的html调用是这样的:

  <script>var socket = io.connect('http://localhost:7000');
  socket.on("news", function(data){
    console.log(data);
  });</script>

我的问题是我无法同时允许angular servicesocket.io call。我在chrome上安装了CORS。当我启用它时,socket.io不起作用,但service有效。enter image description here。当我停用它时,服务无效,socket.io会执行:enter image description here。你能帮我找一个解决方案吗?

更新 我尝试了许多提议的解决方案here。但他们不适合我。

2 个答案:

答案 0 :(得分:0)

试试这个,

app.use(cors({
    origin: function (origin, callback) {
        var allowed = ['http://localhost:7000'].indexOf((origin || '').toLowerCase()) !== -1;
        callback(null, allowed);
    }
}));

答案 1 :(得分:0)

由于错误消息显示:

  

'Access-Control-Allow-Origin'中不能使用通配符'*'   凭证标志为真时的标头

为什么不尝试设置原点?

我会使用以下中间件:

app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "http://localhost:4000");
    next();
});

这假设凭证标志是绝对必要的。