【问题标题】:node.js TypeError: Path must be a string. Received nullnode.js TypeError:路径必须是字符串。收到空
【发布时间】:2016-10-13 20:47:28
【问题描述】:

我最近正在开发一个使用 socket.io、node.js 和 express.js 的 javascript。 这是服务器代码。

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:路径必须是字符串。收到空 在 assertPath (path.js:8:11) 在 win32.join (path.js:221:5) 在exports.send (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\node_modules\connect\lib\middleware\static.js:127:20) 在 ServerResponse.res.sendfile (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\response.js:186:3) 在 C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\server.js:23:14 在回调(C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:272:11) 在参数 (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:246:11) 通过时(C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:253:5) 在 Router._dispatch (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:280:5) 在 Object.Router.middleware [作为句柄] (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:45:10)

我使用不稳定的 v0.5.8 windows 二进制版本的 node 开发了这个。 但我目前运行的是 4.4.5 版本。

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

【问题讨论】:

    标签: node.js sockets


    【解决方案1】:

    从您粘贴的示例代码中很难分辨,因为您的堆栈跟踪引用 index.js 中的第 45 行作为问题的根源 (C:\Users\Akshay\Desktop\whiteboard-master\whiteboard-master\node_modules\express\lib\router\index.js:45:10) 但是当我查看您的示例/粘贴代码时在 IDE 中,它在那里没有做任何事情。对 sendfile 的唯一调用(在您的堆栈跟踪中进一步引用)在脚本的前面。

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

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

    【讨论】:

    • 非常感谢。我会试试的。我尝试单独运行 index.html 文件,它运行顺利,但我会再次检查
    猜你喜欢
    • 2017-04-23
    • 2017-05-18
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2020-08-12
    相关资源
    最近更新 更多