linux – 使用Express提供网页时使用`path.join`的节点JS TypeError

前端之家收集整理的这篇文章主要介绍了linux – 使用Express提供网页时使用`path.join`的节点JS TypeError前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚在运行 Linux Peppermint Three的上网本上安装了Node JS(v0.10.0).我有一个要运行的文件,其顶部有以下内容
var app = require('express').createServer(),io = require('socket.io').listen(app);

app.listen(8080);

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

问题是,当我访问localhost:8080时,我得到以下内容

TypeError: Arguments to path.join must be strings
    at path.js:360:15
    at Array.filter (native)
    at exports.join (path.js:358:36)
    at exports.send (/home/guy/DropBox/Node/socket_io echo test/node_modules/express/node_modules/connect/lib/middleware/static.js:129:20)
    at ServerResponse.res.sendfile (/home/guy/DropBox/Node/socket_io echo test/node_modules/express/lib/response.js:186:3)
    at usernames (/home/guy/DropBox/Node/socket_io echo test/med.js:11:7)
    at callbacks (/home/guy/DropBox/Node/socket_io echo test/node_modules/express/lib/router/index.js:272:11)
    at param (/home/guy/DropBox/Node/socket_io echo test/node_modules/express/lib/router/index.js:246:11)
    at pass (/home/guy/DropBox/Node/socket_io echo test/node_modules/express/lib/router/index.js:253:5)
    at Router._dispatch (/home/guy/DropBox/Node/socket_io echo test/node_modules/express/lib/router/index.js:280:5)

完全相同的文件在我的Windows XP笔记本电脑上工作,但我还没有更新Node(仍在运行v0.8.15).所以我不知道是不是我在Linux上安装了Node(我是新手),这就是问题或版本之间的差异.显然我不想在Windows上更新Node,如果它会导致同样的问题.

我已经检查过Express应该在哪里,这似乎没问题.我试过通过npm重新安装它.我查了一下错误(通过搜索上面的第一行)并找到提及hereherehere,所有人似乎都在说它已经解决了.

有什么想法我可以试着让我的简单页面服务器工作吗?

解决方法

在尝试从0.6.14升级时,我在节点v0.10.2上也遇到过这种情况.问题在于连接静态中间件,以及它如何处理路径以及path.join如何处理其args的可能回归.

这是来自connect的有问题的代码

// setup
  var maxAge = options.maxAge || 0,ranges = req.headers.range,head = 'HEAD' == req.method,get = 'GET' == req.method,root = options.root ? normalize(options.root) : null //<!-- should be '',redirect = false === options.redirect ? false : true,getOnly = options.getOnly,fn = options.callback,hidden = options.hidden,done;

稍后,当路径连接时,最终会返回null,从而导致v0.10.2下的错误

// join / normalize from optional root dir
  path = normalize(join(root,path));

在节点0.8.21下,你得到这个

> require('path').join(null,'file.txt');
'file.txt'

在节点0.10.2下,您可以获得此信息

> require('path').join(null,'file.txt');
TypeError: Arguments to path.join must be strings
    at path.js:360:15
    at Array.filter (native)
    at Object.exports.join (path.js:358:36)
    at repl:1:17
    at REPLServer.self.eval (repl.js:110:21)
    at repl.js:249:20
    at REPLServer.self.eval (repl.js:122:7)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)

TL; DR

您可以在此期间对代码进行修补,以解决此问题.

绝对的道路

var filepath = '/some/absolute/path/to/file.ext';
res.sendfile(path.basename(filepath),{root: path.dirname(filepath)});

要么

相对路径

res.sendfile('file.ext',{root: __dirname})

设置{root:”}将无法在静态中间件中进行真正的测试.

猜你在找的Linux相关文章