我刚刚在运行
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重新安装它.我查了一下错误(通过搜索上面的第一行)并找到提及here和here和here,所有人似乎都在说它已经解决了.
有什么想法我可以试着让我的简单页面服务器工作吗?
解决方法
在尝试从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:”}将无法在静态中间件中进行真正的测试.