为啥这个简单的socket.io例子总是报找不到一个test的module?
发布于 9 年前 作者 hwoarangzk 5198 次浏览 最后一次编辑是 8 年前 来自 问答

我的demo放在d:\projects\socket下的,npm install socket.io没问题,然后copy了socket.io官网的简单例子: <pre> var server = require(‘http’).createServer(); var io = require(‘socket.io’)(server); io.on(‘connection’, function(socket){ socket.on(‘event’, function(data){}); socket.on(‘disconnect’, function(){}); }); server.listen(3000); </pre> 然后执行的时候,总是报Error: Cannot find module 'D:\projects\socket\test'。没明白这个test是哪儿来的。。。

10 回复

你怎么启动程序的?

@garfieldzf8 以上代码保存为index.js,然后我在d:\projects\socket下,直接node index

堆栈信息发上来看看,里面应该有吧

奇怪的,还是同样的代码,现在没有报错,但是浏览器里输入http://localhost:3000,页面就一直没反应,控制台也没任何信息输出

… 没错啊,你这个server 又没什么中间件,也没有处理 http 请求,就一空壳,哪会有什么反应!

$ express demo
$ cd demo
$ npm i
$ npm i socket.io --save
$ vi bin/www

在27行的位置,插入

var io = require('socket.io')(server);
io.on('connection', function(socket){
  debug('Socket Client Connected');
  socket.on('disconnect', function() {
    debug('Socket Client Disconnected');
  });
  socket.on('echo', function(message) { 
    debug('Echo:', message);
    socket.emit('message', message);
  });
});

把 views/index.jade 改成:

extends layout

block content
  h1= title
  p Welcome to #{title}
  pre(id='messages')
  form(onsubmit='return send()')
    input(type='text', id='content')
    button 发送
  script(type='text/javascript', src='/socket.io/socket.io.js')
  script(type='text/javascript').
    var socketClient = io();
    var contenti = document.getElementById('content');
    var messages = document.getElementById('messages');
    socketClient.on('message', function(message) {
      messages.innerHTML += '\n' + message.content;
    });

    function send() {
      socketClient.emit('echo', { content: contenti.value });
      contenti.value = '';
      return false;
    }

启动服务器:

$ DEBUG=demo:* bin/www

再试试

server.listen(3000,function(){ console.log(‘server begin…’); })

加上这句代码,看看服务器起来没?

我再试试,多谢大家

@klesh 之前我的例子,我在浏览器输入地址后按回车,浏览器的loading图标一直在转,停不下来,就算我在connection监听函数里加console.log,控制台也没任何输出的

@hwoarangzk

  1. 你浏览器按下按钮跟 socket.io 是没任何关系的, 相应的是 server 对象进行处理的。你在createServer 时根本没有传任何处理函数进去,浏览器请求时当然就是转个不停了。

  2. socket.io 原理上是附加到 server 对象里面,当检测到 socket.io 的请求再接管。你只有在客户端,用 socket.io client 对象建立连接才是 socker.io 的管辖范围

原来如此,谢谢!我以为官网上最简单的示例会有点啥东西出来的

回到顶部