2013-05-26 2 views
11

Wie kann ich das öffentliche Verzeichnis in einer Meteor-Anwendung in meinem/Server-Pfad lesen.Lesen von Dateien aus einem Verzeichnis in einer Meteor App

Ich versuchte mit dem nativen 'fs' Paket, aber ich bekomme immer eine Datei/Verzeichnis nicht gefunden Fehler.

var fs = Npm.require('fs'); 
var files = fs.readdirSync('/public/soundfiles/'); 

Hat jemand verwendet das Dateisystem-Paket statische Dateien in einem Meteor-Anwendung zu lesen?

+2

Sie verwenden einen absoluten Pfad ''/''. Versuchen Sie es mit einem relativen "./Public/soundfiles /" oder "public/soundfiles /" –

+1

Versuchte alle relativen Pfade - aus irgendeinem Grund beginnt fs aus meinem Paketverzeichnis zu lesen. Zum Beispiel, wenn ich "." Übergebe und ich "Dateien" ausspreche, bekomme ich alle Dateien in meinem Paketverzeichnis? – Warz

Antwort

2

Greifen Sie auf Dateien ohne den Teil "/ public" zu. In einer laufenden Meteor-App wird das Verzeichnis public zu Ihrem Stammverzeichnis und alles, das sich unter befindet, kann unter /whatever abgerufen werden.

Außerdem, wenn Sie spielen, um mit Dateien, können Sie diese nützlich finden:

2

Diese nicht mehr wahr ist. Für Meteor 0.8 ist der Ordner "../client/app" öffentlich. Verwenden Sie daher fs.readdirSync ('../ client/app'), um Dateien und Ordner öffentlich zu erhalten.

Quelle: persönliche Erfahrung und https://stackoverflow.com/a/18405793

+2

Verwenden von Meteor 1.0.1. Ich musste das verwenden: fs.createReadStream ("../../../../../ public/data"); Scheint verrückt, weiß ich, aber das ist, was für mich arbeitete – davedonohue

2

Für Meteor 1.0.2 public ist /web.browser/app/ Geprüft von .meteor dir Gesamt Weg in Linux /home/user/your_app_name/.meteor/ eingeben local/build/programs/web.browser/app/ Und um zum root zu gelangen, ist `process.env.PWD oder process.cwd(). Ich bin nicht sicher, ob seine Arbeit bereitgestellt wird.

_meteor_bootstrap_.serverDir +'/assets/app' 

Dies ist der Pfad zum privaten Ordner.

+0

1.0 sagt 'ReferenceError: _meteor_bootstrap_ ist nicht definiert.' –

4

Ich habe gelernt, dass es am besten ist, Dateien in Ihrem privaten Ordner hochzuladen, wenn Sie sie nicht draußen anzeigen. In meinem Fall muss ich XML-Uploads speichern und verarbeiten. Zuerst schrieb ich die XML in den öffentlichen Ordner, aber das würde ein Neuladen auslösen. Dann habe ich den Upload-Ordner in /public/.#uploads umbenannt, was das erneute Laden von Meteor stoppen würde, aber dann wieder ... es ignorierte diesen Ordner komplett während des Builds und der hochgeladene Ordner würde nicht im Build existieren (ENOENT-Fehler werfen) während des Lesens).

So habe ich herausgefunden es am besten ist, die Dateien in/private/Dateien zu setzen und geht dann wie folgt lautet:

result = fs.readdirSync('assets/app/files')

Alles im privaten Ordner wird dem Assets-Ordner verschoben werden, wo während Zur Laufzeit steht ein APP-Ordner zur Verfügung (das sehen Sie in Ihrer Build-Ordnerstruktur nicht).

Es hilft einfach nur dump result = fs.readdirSync('.') zu sehen, in welchem ​​Ordner Sie und durch die Struktur zu sehen.

*** UPDATE ***** Lokale Dateien in private Ordner noch ausgelöst Meteor Rebuild/Update (vielleicht nicht in der Produktion ..), So fand ich eine andere Lösung, die die UploadServer nur das Upload-Verzeichnis zu definieren, mit: https://github.com/tomitrescak/meteor-uploads

1

Dieses Meteor funktioniert für mich 1.0:

var fs = Npm.require('fs') 
var xsd = fs.readFileSync(process.cwd().split('.meteor')[0] + 'server/company.xsd', 'utf8') 
+0

funktioniert auf lokaler aber scheitert auf einem Produktionsaufbau, haben Sie dieses in einem Produktionsaufbau verwendet? – chulian

+0

Aus Mangel an Entwicklern und langsamem Kompilieren unter Windows wurden letztes Jahr alle Meteor Projekte hier abgebrochen, also habe ich es vergessen. –

+0

@chulian Diese Lösung funktioniert in der Regel für die Kompilierung. Wahrscheinlich wurde dies in einem Paket verwendet. Es funktioniert nicht in der Produktion, da die Pfade geändert werden, die gleiche Geschichte wie in anderen Antworten beschrieben. – ghybs

0

Für Meteor 1.4, verwenden Server Assets. Siehe die offizielle Dokumentation zu Assets http://docs.meteor.com/api/assets.html

+0

Das Problem ist, dass Assets für Nur-Text-Dateien ist, aber ich möchte die Liste der Jsx-Dateien in einem Ordner lesen, um die Reaktion Routerpfade zu erstellen – chulian