【问题标题】:How can I get simple response from node.js server?如何从 node.js 服务器获得简单的响应?
【发布时间】:2016-01-19 23:41:09
【问题描述】:

我正在尝试学习 Node.js(创建 REST API 并从服务器发送消息)。所以我有一个关于从服务器发送响应到客户端的问题。当我从服务器端记录请求时,我看到了请求,但我无法向客户端发送消息。

我的 Node.js 服务器:

//handle a user request
function onRequest(request, response){
    if(request.method =='GET' && request.url=='/'){
        response.writeHead(200, {"Content-Type":"text/html"});
        fs.createReadStream("./index.html").pipe(response);
        console.log(request.url);
    }
    else if(request.method =='GET' && request.url=='/try'){
     console.log("I am getting the request");
     response.writeHead(200, {"Content-Type":"text/plain","Access-Control-Allow Origin":"*"});

        response.write("test message");
        response.end();
    }
    else{
        console.log(request.url);
        send404Response(response);
    }

}

http.createServer(onRequest).listen(8888);

我的客户端函数:

function sendRequest(){

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (xhttp.onreadystatechange==4 && xhttp.status == 200) {
            alert("test alert") ;
            }
        }
        xhttp.open("GET", "http://127.0.0.1:8888/try", true);
        xhttp.send();

        }

任何帮助表示赞赏...在此先感谢

【问题讨论】:

  • 您是否尝试过在所有条件下将客户端代码更改为“警报”,而不仅仅是状态 200?此外,如果您从浏览器运行客户端,查看控制台日志可能会有所帮助(如 chrome 上的 F12)。
  • 用 chrome 控制台结果更新了问题
  • 更新了当前状态的问题...我在 chrome 控制台上没有得到任何东西,我也没有得到警报

标签: javascript jquery html node.js


【解决方案1】:

我通过改变 if 语句解决了这个问题:

if (xhttp.onreadystatechange==4 && xhttp.status == 200)

收件人:

if (xhttp.readyState==4 && xhttp.status == 200)

【讨论】:

  • 虽然尝试用 vanilla Javascript 编写代码很有趣(我自己就是这样开始的),但我建议您看看一些库,它们可以让执行 http 请求变得更加容易。客户端你可能想要使用 JQuery,服务器端你可能想要使用 nodejs 的请求模块。两者都导致比普通 Javascript 更简单的 http 请求。
【解决方案2】:

尝试将“Access-Control-Allow-Origin”添加到您的响应标头中:

这是一个解释 CORS 的链接: http://www.html5rocks.com/en/tutorials/cors/

【讨论】:

  • 我已经尝试过了,但它会产生另一个错误:net::ERR_CONNECTION_RESET
  • 更新了问题...我现在没有收到任何错误,但我也没有收到警报
【解决方案3】:

感谢您的更新。您似乎遇到了臭名昭著的跨域请求问题......这是一个安全问题,粗略地说浏览器不允许从一个站点加载的页面向另一个站点发出 ajax 请求。

换句话说,重要的是您的浏览器如何打开发出 ajax 请求的 html。如果页面本身是通过'http://127.0.0.1:8888/index.html'(其中 index.html 有一些按钮或任何发出 ajax 的地方)获得的,应该没问题。 如果您的最终意图确实是将静态页面部署在进行动态回复的同一服务器+端口上,那么您很好。如果您打算将它们部署在不同的机器/端口上,您可能需要研究 CORS...

【讨论】:

  • 我的意图是在 localhost:8888/ 上创建静态页面以进行动态回复...但是在我的回复中添加了“Access-Control-Allow-Origin”标头之后。我得到 net::ERR_CONNECTION_RESET 错误
  • 澄清一下——您是否真的遵循了这个意图,并确保浏览器通过127.0.0.1(不是“localhost”,因为这与您的 xhttp.open 代码不匹配)打开您的页面?如果是这样,你不应该需要那个“允许来源”。允许来源用于跨域(=如果您以不同方式打开页面),如果您想要跨域,则可能需要一些适当的第 3 方实施,它有时不仅仅是一个标题(例如“预检”协商)
  • 是的,你是对的......在调试时我意识到如果我使用 127.0.0.1 则无需添加“访问控制允许来源”标头。顺便说一句,问题在于 if 语句。我添加了一个答案
猜你喜欢
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2014-03-25
相关资源
最近更新 更多