guy*_*sey 8 linux node.js express socket.io
我刚刚在运行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');
});
Run Code Online (Sandbox Code Playgroud)
问题是,当我访问时,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)
Run Code Online (Sandbox Code Playgroud)
完全相同的文件在我的Windows XP笔记本电脑上工作,但我还没有更新Node(仍在运行v0.8.15).所以我不知道是不是我在Linux上安装了Node(我是新手),这就是问题或版本之间的差异.显然我不想在Windows上更新Node,如果它会导致同样的问题.
我已经检查过Express应该在哪里,这似乎没问题.我试过通过npm重新安装它.我查了一下错误(通过搜索上面的第一行),发现在这里,这里和这里提到,所有人似乎都说它已经解决了.
有什么想法我可以尝试让我的简单页面服务器工作吗?
mik*_*dek 13
在尝试从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;
Run Code Online (Sandbox Code Playgroud)
稍后,当路径连接时,最终会返回null,从而导致v0.10.2下的错误
// join / normalize from optional root dir
path = normalize(join(root, path));
Run Code Online (Sandbox Code Playgroud)
在节点0.8.21下,你得到了这个
> require('path').join(null, 'file.txt');
'file.txt'
Run Code Online (Sandbox Code Playgroud)
在节点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)
Run Code Online (Sandbox Code Playgroud)
TL; DR
您可以在此期间对代码进行修补,以解决此问题.
绝对的道路
var filepath = '/some/absolute/path/to/file.ext';
res.sendfile(path.basename(filepath), {root: path.dirname(filepath)});
Run Code Online (Sandbox Code Playgroud)
要么
相对路径
res.sendfile('file.ext', {root: __dirname})
Run Code Online (Sandbox Code Playgroud)
设置{root: ''}将无法在静态中间件中进行真正的测试.
问题似乎是与新版本的Node不兼容。我必须将Express更新到v3.1.0,将Socket.IO更新到v9.1.13。然后,我还必须将Windows笔记本电脑上的NodeJS更新到Linux上网本v0.10.1上安装的最新版本。
由于两台计算机上的所有内容都是最新的,因此需要将代码(如上所述)更改为以下内容:
var app = require('express')(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
server.listen(8080);
// routing
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
Run Code Online (Sandbox Code Playgroud)
请注意,此处的Express模块是直接调用的,与之前使用的方法调用相反。还要注意,IO必须侦听server围绕Express调用创建的内容(即,不像app我以前那样);这使Socket.IO脚本在客户端启动时遇到了一些问题。在撰写本文时,鉴于从哪里提供页面,我仍然不完全了解如何访问脚本。当我了解更多信息时,我将尝试返回并进行更新。
PS。我要感谢@robertklep,他指导了我这一点,正如你可能在上面的评论中看到的那样。谢谢!
| 归档时间: |
|
| 查看次数: |
11405 次 |
| 最近记录: |