Node JS TypeError mit der `Pfad.join` beim servieren Webseite mit Express
Habe ich gerade installiert, Node JS (v0.10.0) auf ein netbook mit Linux Peppermint Drei. Ich habe eine Datei ausgeführt, die die folgenden an der Spitze:
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');
});
Das problem ist, wenn ich Besuch localhost:8080
bekomme ich die folgende:
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)
Die genau die gleiche Datei funktioniert auf meinem Windows XP laptop, aber ich habe noch nicht aktualisiert-Knoten gibt es noch (läuft noch v0.8.15). Also ich weiß nicht, ob es meine installation von Knoten auf Linux (zu denen auch ich bin neu) das ist das problem oder der Unterschied zwischen den Versionen. Natürlich möchte ich nicht den Knoten update auf Windows, wenn es geht, zu verursachen das gleiche problem.
Habe ich überprüft, der Express ist, wo es sein sollte und das scheint okay zu sein. Ich habe versucht, re-installieren Sie es über npm. Ich habe gesucht bis der Fehler (durch die Suche für die erste Zeile oben) gefunden und erwähnt hier und hier und hier, wo alle scheinen zu sagen es ist gelöst.
Irgendwelche Ideen, was sonst noch (wenn überhaupt), damit ich versuchen kann, um meine einfache Seite server arbeiten?
- Da bist du mit
require('express').createServer()
, sind Sie sicher, dass Ihre Express ist up-to-date? Express-3.x verwendetrequire('express')()
. Versuchen Sie auch, und sehen, ob es funktioniert, wenn Sie führen Sie es in ein Verzeichnis, das keine Leerzeichen im Namen (socket_io test echo
). Dein Beispiel funktioniert in Knoten 0.10.1 und Express-3. - Ich lief
npm view express version
im terminal zum Ordner und habe 3.1.0, so wie auch unter Windows. Ich habe auch einige Unterstriche statt Leerzeichen in den Ordner Namen, aber es ist immer noch nicht das problem gelöst. Ich habe versucht, das entfernen.createServer
aber das warf ein TypeError (object is not a function
) so nun nicht sicher, ob die Versionsnummer angezeigt korrekt ist, wenn das, was Sie sagen, wahr ist. Vielen Dank für die Anregungen. npm view
zeigt die version des Pakets in die NPM-registry, nicht die version, die Sie lokal installiert haben, versuchennpm list express
statt.- Dank für, die. Du hast Recht; Express war nicht mehr aktuell. Das problem war im Paket.json', die ich hatte, zu ändern, zu 3.1.0 zu aktualisieren. Als Ergebnis, ich habe mich verändert, meinen code zu
require('express')()
. Aber ich bekomme immer noch das ursprüngliche problem. Das problem scheint zu sein, mit dem Aufrufres.sendfile()
(bei, wie oben gezeigt,11:7
), Frage ich mich, ob es etwas zu tun mit meinem Einsatz__dirname
, da, wenn, dass nicht definiert ist, dann könnte das sein, erstellen Sie die Zeichenfolge/Argumente problem... Es gibt keine Erwähnung von__dirname
im der relevante Teil der API-Referenz. - __dirname ist ein Knoten global. Versuchen
console.log(__dirname + '/index.html')
in Ihrer route-handler, um zu sehen, ob es tatsächlich einen gültigen Pfad enthält. - Danke für den Hinweis und für den Tipp. Es stellte sich heraus, dass die Buchse.io-Bedarf zu aktualisieren und dann musste ich ziehen Sie den Knoten auf meinem Windows-Computer up-to-date, um für diese zu arbeiten. Mein ursprüngliches problem ist Weg aber ich habe jetzt andere 'index.html' kann nicht auf das Skript zugreifen. In der Erwägung, dass einschließlich
<script src="/socket.io/socket.io.js"></script>
Richtung der Spitze 'index.html' arbeitete, bevor, und wird empfohlen, auf die Socket-IO Homepage es ist jetzt nicht in der Lage, die Datei zu finden. Ich bin mir nicht sicher, wie ich werde meine Frage anders formulieren, um für dieses Konto! Vielen Dank für Ihre Hilfe so weit. - Versuchen Sie eine Suche SO für socket.io.js nicht gefunden, ich erinnere mich noch, dass die Frage vor 🙂
- Fertig 🙂 ich hatte zu Lesen, eine Menge Fragen, aber ich endlich gefunden diese one die für mich gearbeitet hat. Vielen Dank für deine Hilfe. Es ist eine Schande, ich kann nicht markieren Sie Ihre Antwort korrigieren. Ich vermute, zuerst werde ich haben, um herauszufinden, wie man meine Frage anders formulieren, so dass es nützlich für andere sein... Oder Sie einfach zu schließen. Trotzdem, nochmals vielen Dank 🙂
- Sie können Ihre eigene Frage zu beantworten, wie Sie die Probleme gelöst. Könnte jemand helfen, in der Zukunft 🙂
- Ich habe das getan, jetzt. Ich habe Ihnen Kredit zu helfen, mich durch diesen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich festgestellt das auf dem Knoten v0.10.2, beim Versuch ein upgrade von 0.6.14. Das problem liegt in der Verbindung von statischen middleware, und wie es behandelt die Wege und eine mögliche regression in wie Weg.join wickelt seine Argumente.
Hier der problematische code vom connect
Später, wenn der Weg ist, kam Sie am Ende mit einer null den Fehler verursacht, die unter v0.10.2
Unter Knoten 0.8.21, erhalten Sie diese
Unter Knoten 0.10.2, bekommen Sie dieses anstatt
TL;DR
Können Sie monkey-patch-Codes in der Zwischenzeit um das Problem zu umgehen.
Absoluten Pfad
oder
Relativen Pfad
Einstellung
{root: ''}
werden nicht die truthy-test im statischen middleware.require('path').join(null, 'file.txt');
Das problem schien zu sein, eine Inkompatibilität mit der neuen version von Knoten. Ich hatte zu aktualisieren Express v3.1.0 und Steckdose.IO zu v9.1.13. Ich auch, hatte dann update NodeJS auf meinem Windows-laptop auf die neueste version als installiert auf meinem Linux-netbook, v0.10.1.
Alles auf beiden Rechnern up-to-date, den code (wie oben zitiert), dann ändern musste, um die folgenden:
Hinweis: der direkte Aufruf des Express-Modul hier, im Gegensatz zu dem Aufruf der Methode bisher verwendeten. Beachten Sie auch, dass IO Zuhören muss, um die
server
erstellt, um die Express-Aufruf (d.h., nichtapp
so hatte ich es vor); diese haben etwa einige Probleme mit dem erhalten der Steckdose.IO-Skript zu starten, die auf der client-Seite. In der Zeit schreiben, die ich noch nicht vollständig verstehen, wie das Skript aufgerufen wird angegeben, wo die Seite wird serviert von. Ich werde versuchen, wieder zu kommen und diese zu aktualisieren, wenn ich mehr wissen.PS. Ich bin Schuld @robertklep wer geleitet mich durch diese, wie Sie können sich wahrscheinlich sehen, in den Kommentaren oben. Danke!
Quick fix