【问题标题】:Node.js - socket.io web appNode.js - socket.io 网络应用
【发布时间】:2013-05-11 18:02:22
【问题描述】:

我创建了一个基本的 node.js 服务器程序并使用 socket.io 从客户端传递一些字段数据(见下文)。很高兴,因为我是这个行业的新手。我喜欢这种 node-express-socket.io 方法,因为它全部是 Javascript,并且显然可以被大多数浏览器(包括移动设备)使用。问题是我有点摸索,并没有完全理解我创造了什么!两个问题...

1) 我需要使用“//ajax.googleapis.com...jquery...”吗?这很烦人,因为浏览器需要有互联网连接才能工作。是否有另一种无需互联网连接即可访问 html 文档元素的方法?

2) "app.use(express.static...." 行是做什么的?"app.get..." 函数​​似乎需要它才能工作。

如果还有其他关于我的代码的通用 cmets,请告诉我!

干杯,

柯布斯

客户端代码:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect(document.location.protocol+'//'+document.location.host);
    function clicked(){
        $(function(){
            var makeInput=$('.app').find('#make').val();
            var modelInput=$('.app').find('#model').val();
            socket.emit('make', makeInput);
            socket.emit('model', modelInput);
        });     
    };
</script>

服务器端代码:

var express = require('express');
var http = require('http');
var socketio = require('socket.io');

var app = express();
var server = http.createServer(app);
var io = socketio.listen(server);

app.use(express.static(__dirname));

app.get('/', function (req, res) {
  res.render(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.on('make', function (make) {
    socket.on('model',function (model){
          console.log('recieved message:', make+','+model);  
      });
  });
});
server.listen(8000);

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    1) 由于您已经设置了一个静态 Web 服务器(参见答案 2),您可以简单地下载 jquery 源并从那里提供 .js 文件。

    2) "app.use(express.static...." 配置静态网络服务器并将 http 根目录设置为 node.js 脚本所在的目录,如 __dirname 变量所示。对于更多详细信息,请参阅app.use API reference

    因此,我建议您将app.use 更改为:

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

    并将所有静态文件(包括 jquery 文件)放在 public 子目录下。

    此外,您的服务器端代码依赖于 makemodel 的序列,应该更改。例如,如果您将发出顺序切换为model 然后make,您应该看到您的服务器的console.log 将从上一次调用中获取make。

    请尝试以下方法:

    // On server:
    socket.on('info', function (info) {
        console.log('recieved message:', info.make+','+info.model);  
    });
    
    // On client:
    socket.emit('info', { make: makeInput, model: modelInput })
    

    【讨论】:

    • 感谢 marcoseu 非常有帮助,我不知道如何在一个命令中“发出”多个字符串。如果发出的数据是浮点数数组,您会推荐什么方法?
    • 尝试将数组包装在字典中:{ nums: [1.2, 1.3, 1.4]}.
    【解决方案2】:

    1) 如果您更喜欢,您也可以从您的服务器上提供 jQuery 库。你应该把它放在你项目的 public/vendor 或 public/js 文件夹中。

    2) 这是来自Express 框架的中间件调用,它依次使用连接中间件堆栈。阅读此here

    【讨论】:

    • 感谢回复,我早该考虑下载本地服务了!干杯。我已经阅读了很多关于中间件的内容,但我不相信我理解这个术语的含义。它似乎主要与服务器“安静地”完成的任务相关联。还有比这更多的吗?
    猜你喜欢
    • 2011-11-19
    • 2013-10-31
    • 1970-01-01
    • 2014-04-25
    • 2017-03-10
    • 2015-04-08
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多