我想在Cappuccino中实现一个使用Node.js作为服务器的客户端应用程序。
我目前已经让Node与Express:一起运行
var express = require( 'express' );
var app = express();
app.get( '/an_endpoint', function(req, res){
res.send('Hello From Node Express!n');
});
app.listen(1337);
可通过进行验证
$ node hello_echo.js
$ curl http://127.0.0.1:1337/an_endpoint
> Hello From Node Express!
就客户端代码而言,这是一个简单的小应用程序,有一个按钮可以在点击时执行此操作:
// in did finish launching
[button setTitle:"Ping Node"];
[button setTarget:self];
[button setAction:@selector(doPing:)];
- (void)doPing:(id)sender
{
var connection = [CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:'http://127.0.0.1:1337/an_endpoint/'] delegate:self];
}
- (void)connection:(CPURLConnection) connection didReceiveData:(CPString)data
{
alert('Node Says: ' + data);
}
- (void)connection:(CPURLConnection)connection didFailWithError:(CPString)error
{
alert('Error: ' + error);
}
当我加载应用程序(从http://127.0.0.1:8080/NewApplication/index.html
)并在OS X上的谷歌Chrome中单击按钮时,我在控制台中收到以下错误,第一个是由于后者:
OPTIONS http://127.0.0.1:1337/an_endpoint/ 404 (Not Found) Objective-J.js:716
XMLHttpRequest cannot load http://127.0.0.1:1337/an_endpoint/.
Origin http://127.0.0.1:8080 is not allowed by Access-Control-Allow-Origin.
这显然是因为我的节点服务器位于:1337,我的卡布奇诺应用程序位于:8080,由于端口部分,这两个域在技术上是不同的。
经过一点研究,我写了这篇文章,建议考虑使用JSONP将远程脚本注入应用程序。这听起来很乱,所以如果没有必要的话,我不想走那条路。
所以,我的问题是,如何让Cappuccino和Node.js和谐地工作?似乎如果我能告诉卡布奇诺应用程序使用这个(header("Access-Control-Allow-Origin", "*");
)标题,一切都会好起来,但我不知道该怎么做。我试着让Node发送那个标头,但它似乎什么都没做。
您应该使用node来提供Cappuccino应用程序,这样它就都在同一个端口上。
这里的问题是缺乏CORS保护(跨来源资源共享)的配置。
有点简化:后端通过检查请求是否来自同一服务器(协议、域、主机和端口)来检查前端是否被允许连接到资源。在您的情况下,端口是不同的,因此后端说"否",而前端甚至没有实际执行请求。(这一切都发生在飞行前检查中)。
为了真正解决这个问题,您应该了解CORS,但只有当您计划部署开发之外的东西时,您才真正需要这样做。在此之前,您可以在后端"启用CORS",这样它就可以允许前端访问:
var express = require( 'express' );
var cors = require( 'cors' );
var app = express();
app.use(cors);
app.get( '/an_endpoint', function(req, res){
res.send('Hello From Node Express!n');
});
app.listen(1337);
这将允许所有引用程序访问您的代码。以下是一些更细粒度的示例