2011-12-24 35 views
6

Như tôi đã hiểu, từ http://socket.io/#how-to-use, node.js sẽ tự động phục vụ tệp socket.io trên máy chủ.Socket.io không được phục vụ bởi máy chủ Node.js

Tôi đã cài đặt socket.io với npm install socket.io và tôi có thể thấy rằng nó nằm ở node_modules một cấp trên gốc máy chủ.

server.js:

var static = require('./plugins/node-static'); 
var socketIO = require('socket.io'); 
var clientFiles = new static.Server('./client'); 

var http = require('http'); 
httpServer = http.createServer(function (request, response) { 
    request.addListener('end', function() { 
      clientFiles.serve(request, response); 
     }); 
}).listen(8253); 

var webSocket = socketIO.listen(httpServer); 
webSocket.on('connection', function(client) { ..... 

index.html:

<html> 
<head> 
    <title>Chat</title> 
</head> 
<body> 
    <script src="/socket.io/socket.io.js"></script> 
    <script type="text/javascript" 
      src="http://code.jquery.com/jquery-1.5.2.js"></script> 

    <script type="text/javascript"> 
     $(document).ready(function() { 
      var webSocket = new io.Socket('localhost', { port: 8253 }); 
      webSocket.connect(); ....... 

Bắt đầu từ máy chủ hoạt động tốt, nhưng khi mở index.html, tôi nhận được lỗi sau:

GET http://localhost:8253/socket.io/socket.io.js 404 (Not Found) 
Uncaught ReferenceError: io is not defined     :8253/:25 

Ý tưởng?

+0

"Tôi có thể thấy rằng nó nằm trong node_modules một cấp trên gốc máy chủ". Những gì bạn có nghĩa là "gốc máy chủ"? Không nhầm lẫn với bất kỳ dấu vết của apache, có lẽ? Các module được cài đặt bởi NPM nằm trong repo NPM, chúng không nhất thiết phải liên quan đến kịch bản nút chính của dự án của bạn. Một thành công 'require ('socket.io')' chỉ ra rằng cài đặt là OK và vấn đề là trong mã. – Kos

Trả lời

6

Hãy thử lắng nghe trên máy chủ sau khi bạn ràng buộc nó với socket.io

Nơi này

httpServer.listen(8253); 

sau

var webSocket = socketIO.listen(httpServer); 
3

Đã chỉnh sửa: Xin lỗi, tôi đã viết điều gì đó không trả lời câu hỏi của bạn.

Về phía khách hàng mà bạn cần như sau:

var socket = io.connect(); //Hostname and port not required - Autodetected 
socket.on('connect', function(){ 
    $('#status').text('Connected'); 
}); 
socket.on('message', function(m){ 
$('#message').text(m); 
}); 
socket.on('disconnect', function(){ 
$('#status').text('Disconnected'); 
}); 

Làm việc dụ =>https://github.com/parj/node-websocket-demo/blob/master/public/main.js

Thông tin NPM (nếu cần): Nếu bạn đang ở trong Linux

cd <location of your server.js> 
npm install -g socket.ion #install globally 
npm link socket.io. #Create a symbolic link 

Nếu bạn có trên Windows bạn không thể thực hiện liên kết npm

cd <location of your server.js> 
npm install socket.io 

cấu trúc thư mục của bạn sẽ trông như thế

server.js 
node_modules/ #Directory - same level as server.js 
    socket.io #socket.io underneath that 

node_modules phải ở trong cùng thư mục với server.js, không ở trên máy chủ gốc

+0

Tôi không thể nhớ bản thân mình bao giờ cần phải thực hiện các phép thuật như vậy, hướng dẫn giới thiệu cũng không gợi ý điều đó. 'npm install socket.io' nên thực hiện thủ thuật – Kos

+0

BTW" nếu bạn đang sử dụng Windows "hiện tại có hỗ trợ cửa sổ npm không? – Kos

+0

1/npm trên Windows => cf bài viết stackoverflow - http://stackoverflow.com/questions/7300132/how-to-use-npm-with-node-exe 2/Magic? :) Các hướng dẫn nói về cài đặt npm. Những gì họ bỏ lỡ là, nếu bạn có một số dự án với cùng một thư viện. Sau đó, cho mỗi dự án bạn đi và chạy npm cài đặt? Giải pháp tốt hơn (imo) là cài đặt nó trên toàn cầu 'npm install -g' và sau đó tạo liên kết tới nó' npm link'. Bằng cách đó bạn chỉ phải cài đặt ở một nơi và chỉ nâng cấp một nơi. –

-1

Đối với những người triển khai trên Azure (Tôi không thể xác minh cho bất kỳ nền tảng nào khác), hãy đảm bảo rằng tệp package.json của bạn bao gồm tập lệnh bắt đầu.

Ví dụ:

"scripts" : { "start": "node index.js" } 
+0

Gợi ý này hợp lệ, nhưng không thực sự cho vấn đề này. Azure có các yêu cầu cụ thể cho các ứng dụng Node, nhưng điều đó không có gì liên quan đến socket.io. – kubal5003

1

Khi bạn đang chuyển đổi từ một ứng dụng nhanh thường xuyên:

const express = require('express') 
const app = express() 
app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 

Điều quan trọng là phải làm hai việc:

One (mà một Tôi tin rằng tất cả mọi người được bên phải):

var server = require('http').Server(app); 
var io = require('socket.io')(server); 

Hai (cái này rất dễ bỏ sót): Gọi server.listen thay vì app.listen

Tôi đã dành gần hai giờ gỡ lỗi này, đó là lý do tại sao tôi ghi lại tài liệu.

Các vấn đề liên quan