0

我对 node.js 真的很陌生,所以如果我犯了一个明显的错误,请多多包涵。

为了理解node.js,我正在尝试创建一个基本上是:1)每次访问根URL(localhost:8000 /)时都更新页面并附加“hello world”。2) 用户可以转到另一个 url (localhost:8000/getChatData),它将显示从触发的 url (localhost:8000/) 构建的所有数据

我遇到的问题:1)我在渲染页面上显示该数据时遇到问题。我有一个计时器,它应该每秒调用一次 get_data() 并使用存储附加输出的数据变量更新屏幕。特别是 response.simpleText(200, data); 下面的这一行 无法正常工作。

文件

// Load the node-router library by creationix
var server = require('C:\\Personal\\ChatPrototype\\node\\node-router').getServer();

var data = null;
// Configure our HTTP server to respond with Hello World the root request
server.get("/", function (request, response) {
    if(data != null)
    {
        data = data + "hello world\n";
    }
    else
    {
        data = "hellow world\n";
    }
    response.writeHead(200, {'Content-Type': 'text/plain'});
    console.log(data);
    response.simpleText(200, data);
    response.end();

});

// Configure our HTTP server to respond with Hello World the root request
server.get("/getChatData", function (request, response) {
    setInterval( function() { get_data(response); }, 1000 );

});

function get_data(response)
{
    if(data != null)
    {
        response.writeHead(200, {'Content-Type': 'text/plain'});

        response.simpleText(200, data);
        console.log("data:" + data);
            response.end();
    }
    else
    {
        console.log("no data");
    }
}

// Listen on port 8080 on localhost
server.listen(8000, "localhost");

如果有更好的方法来做到这一点,请告诉我。目标是基本上有一种方法让服务器调用 url 来更新变量,并让另一个 html 页面每秒动态报告/显示更新的数据。

感谢:D

4

2 回答 2

0

客户端服务器模型的工作原理是客户端向服务器发送请求,然后服务器返回响应。服务器无法向客户端发送未请求的响应。客户端发起请求。因此,您不能让服务器定期更改响应对象。

客户端不会获得对请求的这些更改。像这样的事情通常是如何处理的,因为AJAX服务器的初始响应会向客户端发送 Javascript 代码,客户端会每隔一段时间向服务器发起请求。

于 2013-09-24T02:42:49.403 回答
0

setTimeout接受不带参数的函数,这很明显,因为它将在稍后执行。您在该函数中需要的所有值都应该在该时间点可用。在您的情况下,response您尝试传递的对象是一个本地实例,其范围仅在server.get' 的回调内(您在其中设置setTimeout)。

有几种方法可以解决此问题。您可以在 get_data 所属的外部范围内保留响应实例的副本,或者您可以将 get_data 完全移动到内部并删除setTimeout。不推荐第一种解决方案,因为如果getChatData在 1 秒内多次调用,最后一个副本将占上风。

但我的建议是保留data数据库并在getChatData调用时显示它。

于 2013-09-24T22:01:39.640 回答