7

Linux PeppermintThreeを実行しているネットブックにNodeJS(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)

まったく同じファイルがWindowsXPラップトップで機能しますが、まだノードを更新していません(v0.8.15を実行しています)。ですから、問題なのはLinuxへのNodeのインストールなのか(私は初めてです)、バージョン間の違いなのかはわかりません。明らかに、同じ問題が発生する場合は、WindowsでNodeを更新したくありません。

Expressが本来あるべき場所にあることを確認しましたが、問題ないようです。npm経由で再インストールしてみました。私は(上記の最初の行を検索して)エラーを調べたところ、こことこことここに言及が見つかりましすべて解決したと言っているようです。

シンプルなページサーバーを機能させるために他に何ができるか(もしあれば)何かアイデアはありますか?

4

3 に答える 3

13

0.6.14からアップグレードしようとしているときに、ノードv0.10.2でもこれに遭遇しました。問題は、接続静的ミドルウェアと、それがパスを処理する方法と、path.joinが引数を処理する方法で発生する可能性のあるリグレッションにあります。

これが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: ''}すると、静的ミドルウェアでの真のテストに失敗します。

于 2013-04-03T17:33:43.523 に答える
5

問題は、新しいバージョンの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');
});

以前に使用されたメソッド呼び出しとは対照的に、ここでExpressモジュールが直接呼び出されることに注意してください。serverまた、IOは、Express呼び出しの周りに作成されたものをリッスンする必要があることに注意してください(つまり、app以前のようにではありません)。これにより、Socket.IOスクリプトをクライアント側で起動する際の問題が回避されました。これを書いている時点では、ページがどこから提供されているかを考えると、スクリプトがどのようにアクセスされるのかまだ完全には理解していません。私はもっ​​と知ったら戻ってきてこれを更新しようとします。

PS。上記のコメントでわかるように、これを案内してくれた@robertklepに感謝します。ありがとうございました!

于 2013-03-24T18:44:00.317 に答える
0

クイックフィックス

sed -i bak -e  's/\/\/.join/if(root\ ==\ null){root="";}\/\//g' node_modules/express/node_modules/connect/lib/middleware/static.js
于 2013-12-14T14:31:08.763 に答える