2015-09-03 52 views
1

我正在处理一个在MEAN堆栈上运行的小应用程序,并遇到了一个令人讨厌的障碍:我的后端应用程序(节点Express)运行在http://localhost:3000,运行良好,但我的前端客户端应用程序(的Javascript AngularJS)运行在http://localhost:8000,这意味着从角发送的请求被接受,并回答了,但一旦他们到达因为他们解释为来自不同来源来被拒绝。在Express中设置默认响应标头

我能以相对较少的戏剧解决这个问题,通过使我的“告诉我所有的东西”的方法是这个样子:

exports.index = function(req, res) { 
    Region.find({}, function(err, docs) { 
    if(!err) { 
     res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); 
     res.json(200, { regions: docs }); 
    } else { 
     res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); 
     res.json(500, { message: err }); 
    } 
    }); 
} 

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');行是我加告诉了一个浏览器可以接受回应并停止打扰我;现在的问题是,我有这个愚蠢行添加到这是一个从任何地方发送的每一个反应,我相信我一定是缺少一些办法只有改变默认的头永远包括Access-Control-Allow-Origin条目。

在一个完美的世界,我可以根据正在执行什么样的环境中的代码和关闭翻盖,但我在app.js会完全满足于一个代码块,我至少可以删除一次而不是试图追踪res.setHeader的75个实例。我想一定有改变落后res.json方法隐藏在它的基础的方式,但该文档不提供任何洞察我怎么可能做到这一点,更何况它是否是一个可怕的想法。有什么想法吗?

编辑

我认为(作为建议)是configuring application-level middleware是关键。下面是我添加到我的app.js文件的代码:

// allow CORS: 
app.use(function (req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); 
    next(); 
}); 

然而,这产生了同样的错误(“没有‘访问控制允许来源’标头出现在所请求的资源”)像之前一样。

+1

这就是'app.use()'用于安装一个中间件处理程序,它可以查看/修改所有请求。 – jfriend00

+0

我有一种感觉,我很接近,但我注册的中间件似乎没有做任何事情(请参阅编辑我的问题);我添加了一些调试输出以查看它何时执行,但它从未在控制台中弹出。我对[内置中间件中的“setHeaders”选项](http://expressjs.com/guide/using-middleware.html#middleware.built-in)感到乐观,但它仅适用于静态资源,而我找不到相应的第三方处理......其他所有内容。 –

+1

看起来你可能还得设置'Access-Control-Allow-Headers'。请参阅http://jonathanmh.com/how-to-enable-cors-in-express-js-node-js/ – jfriend00

回答

1

可以使用。用做一个普通的中间件()或者可以使用NPM包,比如express-interceptor也拦截响应

+0

Gah,我讨厌把这个标记为答案,但是我意识到一旦我批准了这个我忘记重启服务器的人。我在上面添加了我的代码片段,以便您可以看到添加的内容,但实际上并没有工作。 –

1

试试这个作为一个中间件:

app.use(function(req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization'); 
    next(); 
}); 
0

我只是跑进同样的问题,并尝试以上相同的片段。它做了诡计。

// allow CORS: 
app.use(function (req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); 
    next(); 
}); 

我不得不确保把它放在高于一切其他app.use(XYZ)项,就像@rev_bird提到他与该CORS模块。尝试一下。

相关问题