请求 http://localhost:3000/socket.io/socket.io.js 时出现404错误(未找到)。

45

我想向浏览器流数据。然而,我在将其连接到浏览器方面遇到了困难。以下是我的HTML代码:

<ul class="tweets"></ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect();
    jQuery(function ($) {
        var tweetList = $('ul.tweets');
        socket.on('tweet', function (data) {
            tweetList .prepend('<li>' + data.user + ': ' + data.text + '</li>'); 
        }); 
    });
</script>

以下是我的app.js的相关部分:

var express = require('express')
    , twitter = require('ntwitter')
  , http = require('http')
  , path = require('path');

var app = express();

var io = require('socket.io').listen(app);

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

app.listen(app.get('port'), function(){
   console.log("Express server listening on port " + app.get('port'));
});

io.sockets.volatile.emit('tweets', {
            user: data.user.screen_name,
            text: data.text,
            geo : geo,
            latitude: latitude,
            longitude: longitude
                });

我通过我的packages.json文件安装了socket.io 0.9.16:

"dependencies": {
    "express": "3.2.6",
    "jade": "*",
    "ntwitter":"0.2.10",
    "socket.io":"0.9.x"
  }

有人能在这里帮我吗?为什么它找不到文件?

深入挖掘一下。为了测试套接字,我在 app.js 中添加了以下内容:

var socket = io.listen(app);

然后我得到了这个错误:

TypeError: Object #<Manager> has no method 'listen'
    at Object.<anonymous> (/home/andy/dev/node/mytwittermap/app.js:49:17)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3
3个回答

100

您的设置需要类似于这样:

var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);
...
server.listen(app.get('port')); // not 'app.listen'!

34
谢谢,你的这句话:“// not 'app.listen'!” 帮了我很多!! - Jona
5
感谢使用“非app.listen”。 - Eric
4
2016年的时候,我也遇到了同样的错误。虽然细节有所不同,但我们仍需要执行server.listen(而不是在应用程序上)这一步骤仍然是有效的。谢谢! - sra
@sra,你能看一下我刚刚发布的这个吗?http://stackoverflow.com/questions/40659396/socket-io-webrtc-nodejs-video-chat-app-getting-errors-over-https-err-ssl-prot - Erik Grosskurth
(socket.io).listen不起作用,必须直接键入(socket.io)(server)。 - Zeyad Shaban
app.get('port') 对我不起作用,但是 process.env.PORT || 3000 很好。 - avisk

25

你能尝试一下这个吗:

var http = require('http');
var app = express();
var server = http.createServer(app);

var io = require('socket.io').listen(server);

我猜你需要实例化socket.io服务器。


太好了 - 现在似乎已经可以工作了(控制台中有很多好的调试信息)。现在进入为什么它没有在浏览器中显示的问题。非常感谢您的帮助。 - babbaggeii

11
  • 您需要实例化socket.io连接,
  • 您需要使用server.listen()而不是app.listen()

尝试类似这样的内容:

// at the top of app.js
var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);

// your code

// at the bottom of app.js
server.listen('3000', () => {
  console.log('Server listening on Port 3000');
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接