2016-06-13 121 views
0

我最近正在研究一个使用socket.io,node.js和express.js的javascript。 这里是服务器代码。node.js TypeError:路径必须是字符串。收到null

var 
 
    port = +process.argv[2] || 8080, 
 

 
    sanitizer = require('validator').sanitize, 
 
    express = require('express'), 
 

 
    server = express.createServer(), 
 
    io = require('socket.io').listen(server), 
 
    chat = io.of('/chat'), 
 
    canvas = io.of('/canvas') 
 
; 
 

 
function sanitize(string) { 
 
    return sanitizer(string).entityDecode() 
 
} 
 

 
server.listen(port); 
 

 
server.get(/(^\/.*$)/, function(request, response) { 
 
    var fileName = request.params[0]; 
 
    if (fileName == '/') 
 
     fileName = '/index.html'; 
 
    response.sendfile(__dirname + '/client' + fileName); 
 
}); 
 

 
io.sockets.on('connection', function(socket) { 
 
    socket.on('setName', function (name) { 
 
     name = sanitize(name); 
 
     socket.set('name', name); 
 
     socket.broadcast.emit('receive', { 
 
      sender:'Server', 
 
      message:name + ' has joined.' 
 
     }) 
 
    }); 
 

 
    socket.on('send', function (message) { 
 
     socket.get('name', function(error, name) { 
 
      if (name) 
 
       socket.broadcast.emit('receive', { 
 
        sender:name, 
 
        message:sanitize(message) 
 
       }) 
 
     }) 
 
    }); 
 

 
    socket.on('draw', function (command) { 
 
     io.sockets.emit('draw', command) 
 
    }); 
 

 
    socket.on('updateCursor', function(position) { 
 
     socket.get('name', function(error, name) { 
 
      if (name) 
 
       socket.broadcast.emit('updateCursor', { 
 
        name:name, 
 
        position:position 
 
       }); 
 
     }); 
 
    }); 
 

 
    socket.on('disconnect', function() { 
 
     socket.get('name', function(error, name) { 
 
      if (name) { 
 
       socket.broadcast.emit('receive', { 
 
        sender:'Server', 
 
        message:name + ' has left.' 
 
       }); 
 
       socket.broadcast.emit('removeCursor', name); 
 
      } 
 
     }) 
 
    }); 
 
});

我能够成功地架设服务器,但是当我使用本地主机上的浏览器,我收到以下错误:

TypeError: Path must be a string. Received null at assertPath (path.js:8:11) at win32.join (path.js:221:5) at exports.send (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\node_modules\connect\lib\middleware\static.js:127:20) at ServerResponse.res.sendfile (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\response.js:186:3) at C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\server.js:23:14 at callbacks (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:272:11) at param (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:246:11) at pass (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:253:5) at Router._dispatch (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:280:5) at Object.Router.middleware [as handle] (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:45:10)

我已经开发了这个使用不稳定的v0.5.8 windows二进制版本的节点。 但我目前正在运行4.4.5版本。

请帮帮我,我哪里出错了?

回答

0

从你粘贴的示例代码有点难以分辨,因为你的堆栈跟踪引用了你的index.js中的第45行作为问题的根源(​​),但是当我查看你的示例/粘贴代码一个IDE,它没有在那里做任何事情。在脚本的较早部分中,唯一调用sendfile(在堆栈跟踪中进一步引用)。

假设这是您的问题的位置,您应该console.log()或以其他方式调试您尝试发送给访问者的路径/文件名的值。请注意,在Windows中,路径分隔符是\而不是/。您应该使用path.join()来形成所提供文件的最终路径。 ExpressJS示例说明了这一点:

app.get('/', function(req, res) { 
    res.sendFile(path.join(__dirname, 'index.html')); 
}); 
+0

非常感谢。我会尝试。我试图单独运行index.html文件,它运行顺畅,但我会再次检查 –

相关问题