socket.io和不同文件夹--找到解决方案

socket.io和不同文件夹--找到解决方案,socket.io,Socket.io,我是socket.io的新手,我想我已经有问题了。 我已经用npm正确安装了node.js和socket.io。然后,为了进行测试,我剪切并粘贴了socket.io中的一个代码示例,一切正常。 现在,我想构造我的代码和文件夹,我已经创建了一个文件夹“client”,用示例中的客户机代码放置一个新的js文件client.js。 这是我的架构 /client client.js index.html server.js client.js: var socket = io.connect

我是socket.io的新手,我想我已经有问题了。 我已经用npm正确安装了node.js和socket.io。然后,为了进行测试,我剪切并粘贴了socket.io中的一个代码示例,一切正常。 现在,我想构造我的代码和文件夹,我已经创建了一个文件夹“client”,用示例中的客户机代码放置一个新的js文件client.js。 这是我的架构

/client
    client.js
index.html 
server.js
client.js:

var socket = io.connect('http://localhost:80');
  socket.on('news', function (data) {
    alert('sqd');
    console.log(data);
    socket.emit('my other event', { my: 'data' });
});
Uncaught SyntaxError: Unexpected token <
Resource interpreted as Script but transferred with MIME type text/html
server.js

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html', 'utf-8',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html ' + __dirname);
    }

    res.writeHead(200, {'Content-Type' : 'text/html'});
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
index.html

<!doctype html>
<html>
  <head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

    <title></title>

    <script type="text/javascript" src="/client/client.js"></script>
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>

  </head>
  <body>
  </body>
</html>
希望这能帮助别人。 我喜欢在没有帮助的情况下发布问题并自己回复。不知怎的,我的反应太快了。我也喜欢在帖子中讲述我的生活:)
好的,我要吃点东西,多喝点咖啡

非常感谢您!这解决了我的问题!!我将开关更改为以下代码:

var extname = path.extname(filePath);
var contentTypesByExtention = {
  'html': 'text/html',
  'js':   'text/javascript',
  'css':  'text/css'
};
var contentType = contentTypesByExtention[extname] || 'text/plain';

它可能更容易维护:)

这就是我需要的!非常感谢。 及 我们将在顶部添加一个代码行

server.js

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html', 'utf-8',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html ' + __dirname);
    }

    res.writeHead(200, {'Content-Type' : 'text/html'});
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
只有这样才能解决:

function handler (request, response) {
    var file = __dirname + (request.url == '/' ? '/index.html' : request.url);
    fs.readFile(file, function(error, data) {
        if (error) {
            response.writeHead(500);
            return response.end('Error loading index.html');
        }
        response.writeHead(200);
        response.end(data, 'utf-8');
    });
}

您也可以使用
mime
模块:

var mime = require('mime')
  , content_type = mime.lookup(filePath);

// handle the request here ...

response.setHeader('Content-Type', content_type);
response.writeHead(200);
response.end(data);

并且必须使用闭包将
fs.readFile
包装起来,否则某些文件(尤其是最后一个文件)将被多次读取,而其他文件将根本不被读取。而且
contentType
不会按您的意愿设置。这是因为
fs.readFile
使用了回调策略。当html文件只加载一个外部文件时,问题不会出现,但当外部文件(css、js、png)加载多个文件时,问题就会出现,正如我前面指出的。(这是我自己发现的)

因此,您的代码应该做一些如下更改:

;(function (filename, contentType) {

    fs.readFile(filename, function(err, file) {
        // do the left stuff here
    });

}(filename, contentType)); 

谢谢你解决这个问题。但我有一个小问题:在我的例子中,这段代码返回以下错误:路径未定义。欢迎对此有任何想法
;(function (filename, contentType) {

    fs.readFile(filename, function(err, file) {
        // do the left stuff here
    });

}(filename, contentType));