使用Express和ajax进行跨源资源共享

时间:2013-11-12 15:43:27

标签: jquery ajax node.js cross-domain

我遇到以下情况。我想在express(node.js)上应用跨源资源共享,因此我使用的是cors。我有一份表格

的陈述
app.use(cors());

之前的

app.use(app.router);
app.js文件上的

(当然我在文件的顶部加载了cors)。对于服务器生成的响应,我使用以下对象:

var options = {
    "ETag"                         : "",
    "Access-Control-Allow-Origin"  : "*",
    "Access-Control-Allow-Methods" : "HEAD,GET,PUT,POST,DELETE,OPTIONS",
    "Content-Type"                 : "application/json; charset=utf-8",
    "Transfer-Encoding"            : "chunked"
};

然后通过遍历此对象的键,我设置每个响应的标题。

我相信到目前为止一切顺利。现在,在客户端我使用ajax来发布这样的请求:

$.ajax({
    type: "POST",
    accepts: "application/json",
    url: urlForPOST,
    data: JSON.stringify(theData),
    async: true,
    contentType: "application/json; charset=UTF-8", 
    dataType: "json",
    success: function(data, textStatus, jqXHR) {
        alert("Received success: '" + JSON.stringify(data) + "' with ETag '" + jqXHR.getResponseHeader('ETag') + "'");
    },
    error: function (data, textStatus, errorThrown) {
        alert("Received error: '" + JSON.stringify(data) + "'\n Status: '" + textStatus + "'\n error thrown = '" + errorThrown + "'");
    },
    crossDomain: true,
    username: myData.username,
    password: myData.password
}).done(function() {
    alert( "second success" );
}).fail(function() {
    alert( "error while posting" );
}).always(function() {
    alert( "finished" );
});

现在,我最终陷入了以下奇怪的境地。当客户端和服务器在同一台机器上运行时,我在url中写下了“localhost”,然后我就可以从客户端(同一台机器)发布请求。当我将地址的“localhost”部分替换为服务器在LAN上的实际IP时,我可以发布来自其他计算机(以及其他IP)的客户端的请求,但来自客户端在服务器实际运行的同一台机器上。事实上,在这种情况下,当我在同一台机器上使用客户端时,我在服务器日志中看到以下内容:

OPTIONS /aRoute 204 1ms
POST /aRoute 401 2ms

并且客户通知我这是未经授权的交易。好吧,首先我发送的用户名和密码肯定是正确的;事实并非如此。

此外,为什么在这种情况下,此选项会出现在日志中?当我从在其他机器上运行的客户端发布时,服务器日志中没有这样的东西。此外,这不是我所期望的。

总结一下,有人可以解释为什么在这种情况下这个OPTIONS出现在服务器日志中?此外,有没有一种方法可以记下交叉原始的ajax请求,当我在服务器运行的同一台机器上使用客户端时(显然是出于调试目的),以及当我从不同的机器发布请求时?这里至少有一个我遗漏的细节。

提前感谢您的时间和帮助。


我正在编辑原帖以提及此事: 当我删除“cors”模块和相关“app.use(cors())的要求时;”声明,然后我能够使用“app.options(...);”拦截地址上的传入请求。并打印console.log语句。特别是我使用的声明:

app.options(aRoute, function (request, response, next) {
    console.log("FOLLOWING ROUTE THROUGH OPTIONS");
    defs.SET_DEFAULT_JSON_HEADER(response);
    next();
});

其中SET_DEFAULT_JSON_HEADER根据我上面列出的选项设置标题。

1 个答案:

答案 0 :(得分:1)

我在使用chrome中的ajax调用跨源资源时遇到了问题。

我使用了节点js和本地http服务器来部署我的节点js app。

当我访问跨源资源

时,我收到了错误响应

我找到了一个解决方案,

    1) I have added below code to my app.js file

        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");

    2) In my html page called cross origin resource using $.getJSON();

         $.getJSON("http://localhost:3000/users", function (data) {
                alert("*******Success*********");
                   var response=JSON.stringify(data);
                    alert("success="+response);
                    document.getElementById("employeeDetails").value=response;
                });