Node.js - 对于经常更新的内容,这是一个很好的结构吗?

时间:2011-06-18 12:11:04

标签: javascript node.js

作为my question yesterday关于Node.js和与客户沟通的后续行动,我试图了解以下内容如何发挥作用。


案例:

所以,我有这个网站内容经常更新。我们假设这次,这个内容是一个温度的位置列表。 (是的,天气服务)

现在,每次客户检查某个位置时,他或她都会转到这样的网址: example.com/location/id 其中 id 对应于我数据库中位置的ID。


实现:

在服务器上, checktemps.js 循环(每隔一秒左右)遍历my(mySQL)数据库中的所有位置并检查相应的温度。 然后将此数据存储在checktemps.js内的数组。由于温度可能一直在变化,因此继续检查数据库中的更新非常重要。

当发出对 example.com/location/id 的请求时,checktemps.js会查看包含 id = id 的记录的数组。然后,它响应相应的温度。


问题:

纯文本,html或ajax调用目前无关紧要。 我只是好奇我是否有这个权利? Node.js是一个相当不寻常的事情,所以我试着找出这是否合乎逻辑?

2 个答案:

答案 0 :(得分:2)

  

在服务器上,checktemps.js循环   (每隔一秒左右)通过所有   我的(mySQL)数据库中的位置   并检查相应的   温度。然后它存储这些数据   是checktemps.js中的一个数组

效率极低。你不应该做循环(每隔一秒左右)。

模块

下面我会尝试制作一个模块列表(node.js模块和其他模块一样),我会用它来提高效率:

  •   

    npm是节点的包管理器。您可以使用它来安装和发布节点   程式。它管理依赖关系并做其他很酷的事情。

    我真诚地希望您已经了解npm,如果不是,我建议您尽快了解它。一开始你只需要学习如何安装软件包,但这很容易。您只需输入npm install <package-name>即可。后来我真的建议你学习编写自己的软件包来管理依赖项。

  •   

    Express是Node.js的高性能,高级Web开发。

    来自TJ的这个sinatra风格的框架非常甜蜜,你应该阅读可用的文档/截屏,以了解它的力量。

      

    Socket.IO旨在让每个浏览器都可以使用实时应用   移动设备,模糊了   不同之间的差异   运输机制。

  •   

    Redis是一个开源的,先进的   键值存储。它经常被提及   从那以后作为数据结构服务器   键可以包含字符串,哈希,   列表,集合和排序集。

    与Raynos一样,这个极速/性感的数据库具有pubsub语义,这些都是高效处理问题所必需的。我认为你应该真正使用这个数据库(tutorial)来欣赏它的原始力量。安装很简单:make install

  •   

    Node_redis是node.js的完整Redis客户端。它支持所有Redis命令,包括MULTI,WATCH和PUBLISH / SUBSCRIBE。

原型

我记得我过去曾帮助其他用户提出有关pubsub的问题。我想当你看到这个答案时,你会更好地理解如何正确地做到这一点。代码已经发布了一段时间,应该更新(快速的微小变化)到:

var     PORT        = 3000,
            HOST        = 'localhost',
            express = require('express'),
            io          = require('socket.io'),
            redis       = require('redis'),
            app         = module.exports = express.createServer(),
            socket  = null;

app.use(express.static(__dirname + '/public'));

if (!module.parent) {
    app.listen(PORT, HOST);
    console.log("Express server listening on port %d", app.address().port)
    socket = io.listen(app);

    socket.on('connection', function(client) {
        var subscribe = redis.createClient();
        subscribe.subscribe('pubsub'); // listen to messages from channel pubsub

        subscribe.on("message", function(channel, message) {
            client.send(message);
        });

        client.on('message', function(msg) {
        });

        client.on('disconnect', function() {
            subscribe.quit();
        });
    });
}

我有compressed更新的代码,其中包含所有依赖项,但您仍然需要先启动redis。

问题

我希望这会让你知道如何做到这一点。

答案 1 :(得分:0)

使用node.js你可以做得更好。自Web开始以来,请求/响应就体现在我们的头脑中。但是,如果您打开网站/应用程序并且从不结束此调用,则只能执行一个ajax请求。现在,只要有客户端更新,node.js就可以发送数据。在youtube上搜索Introduction to Node.js with Ryan Dahl(node.js的创建者),他解释了这一点。然后,您可以实时更新,而无需始终由客户端提出请求。