Javascript 当客户端不在同一IP上时,无法通过客户端调用节点服务器

Javascript 当客户端不在同一IP上时,无法通过客户端调用节点服务器,javascript,ajax,node.js,express,ionic-framework,Javascript,Ajax,Node.js,Express,Ionic Framework,我有一个运行express js的node js服务器,并使用ionic框架(cordova/phonegap)创建了一个前端客户端。在服务器所在的同一台计算机上运行客户端时,我能够成功地对服务器进行ajax调用,并收到正确的回复,因为它们运行在同一IP上 当我尝试在与服务器不同的IP上运行客户端时,问题就出现了。我已经阅读了在服务器端设置cors的内容。我的设置与这里的设置基本相同: 以下是我的cors设置: var express = require('express'); var com

我有一个运行express js的node js服务器,并使用ionic框架(cordova/phonegap)创建了一个前端客户端。在服务器所在的同一台计算机上运行客户端时,我能够成功地对服务器进行ajax调用,并收到正确的回复,因为它们运行在同一IP上

当我尝试在与服务器不同的IP上运行客户端时,问题就出现了。我已经阅读了在服务器端设置cors的内容。我的设置与这里的设置基本相同:

以下是我的cors设置:

var express = require('express');
var compress = require('compression');
var bodyParser = require('body-parser');

var app = express();
var cors = function(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    appLogger.info('testing');
    if ('OPTIONS' == req.method) {
        res.send(200);
    }
    else {
        next();
    }
};
app.use(cors);
app.use(compress());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(function(err, req, res, next) { // Handle errors...
    res.send(500, err.toString());
    appLogger.error(err.stack);
});
在主机上运行ui时,我会在控制台中看到“测试”,因此我知道它正在进行第一次测试

我还检查了config.xml中ui应用程序的白名单:

<access origin="*" subdomains="true"/>
我也尝试过使用Angular JS的$http

$http({
    method : 'post',
    url: 'http://hostIPAddress:7777/login',
    data: data,
    timeout: 5000
})
.success(function(data, status, headers, config) {
    alert('Success');
})
.error(function(data, status, headers, config) {
    alert('Fail: ' + JSON.stringify(data));
    alert('Status: ' + JSON.stringify(status));
    alert('Headers: ' + JSON.stringify(headers));
    alert('Config: ' + JSON.stringify(config));
});
同样,当客户机与节点服务器在同一台计算机上运行时,这一切(常规ajax调用和angular js的$http方法)都会起作用。我还尝试了使用/不使用crossDomain的ajax调用:true无效

其他资料: 当我运行ajax post调用时,当调用失败时,我没有得到任何相关的反馈。一切都是空的或空白的。$http调用返回404状态,就像找不到主机一样。我可以在服务器未运行时ping与主机关联的IP,但在服务器运行时ping IP时,ping返回超时

有人对可能发生的事情有什么想法吗?如果我能提供更多有用的信息,请告诉我

提前谢谢

更新-2014年11月23日11:08

这是我的客户端ui发送的标题:

Request URL:http://myserverip:7777/login
Request Headers
Provisional headers are shown
Accept:application/json, text/javascript, */*; q=0.01
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Origin:http://localhost:8100
Referer:http://localhost:8100/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)             Chrome/39.0.2171.65 Safari/537.36
Form Data
email:testemail@gmail.com
password:password1
更新-2014年11月24日晚上11:27

我能够通过curl成功地运行从手机到服务器的http请求。因此,我知道我的服务器正在响应外部请求。是爱奥尼亚客户机出了问题

更新-2014年11月26日上午9:18


我尝试从一台计算机的浏览器导航到另一台计算机的url,但它超时了。我试过chrome、safari和IE。我试过在两台不同的计算机上使用curl,但它找不到主机。我可以从我的iPhone导航到url,它会返回正确的响应,但如果我在我的android手机上做同样的事情,它就找不到主机。因此,无论出于何种原因,我只能用iPhone找到主机。

确保您的服务器知道如何响应“选项”请求。如果服务器应用程序没有对选项请求返回正确响应,则浏览器将无法连接到远程服务

我的环境出了问题。我在openshift上托管了我的服务器,它工作得很好。

对不起,我忘了提到我也在文章中提供的url上尝试过。if('OPTIONS'==req.method){res.send(200);}else{next();}我刚刚在cors对象中用它重新测试了它,并且它的行为方式相同。我认为第一次通过至少会登录控制台“测试”,无论客户端是否认为它可以连接。我想看看您的网络活动是什么样子,检查头部是否正确。在浏览器设置中,您可以打开监视,以确保请求和飞行前的标题正确。已将请求的标题添加到帖子中。
Request URL:http://myserverip:7777/login
Request Headers
Provisional headers are shown
Accept:application/json, text/javascript, */*; q=0.01
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Origin:http://localhost:8100
Referer:http://localhost:8100/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)             Chrome/39.0.2171.65 Safari/537.36
Form Data
email:testemail@gmail.com
password:password1