2015-02-18 26 views
11

Próba zapisania pliku za pomocą fs.writeFile w katalogu rodzeństwa. Działa to dobrze, gdy używasz Sitemap.xml do tego samego katalogu, ale nie do ścieżki względnej. Katalog public istnieje i daje ten sam błąd niezależnie od tego, czy istnieje Sitemap.xml czy nie.Błąd ENOENT podczas używania fs.writeFile

Odpowiednia struktura reż:

/public 
    Sitemap.xml 
    app files 
/create-sitemap 
    index.js - file containing code below 
app.js 

fs.write('../public/Sitemap.xml', data.toString(), function(err) { 
    if (err) throw err; 
    console.log("Wrote sitemap to XML"); 
}); 


Toms-MacBook-Pro:moviehunter tomchambers$ node create-sitemap/index.js 

/Users/tomchambers/projects/project/create-sitemap/index.js:88 
     if (err) throw err; 
        ^
Error: ENOENT, open '../public/Sitemap.xml' 
+0

Jak wygląda struktura folderów projektu? –

+0

Dodałem szczegóły – Tom

Odpowiedz

17

Podczas korzystania ścieżek względnych w węźle, są one związane z procesem węzła. Tak więc, jeśli uruchomisz skrypt jak node create-sitemap/index.js z katalogu /Users/tomchambers/projects/project/, będzie on szukał pliku /Users/tomchambers/projects/public/Sitemap.xml, który nie istnieje.

W Twoim przypadku można użyć zmiennej globalnej __dirname, że wróci, as the docs say.

nazwa katalogu, który znajduje się skrypt aktualnie wykonywany w

więc kod powinien wygląda tak:

var path = require('path'); 

fs.write(path.join(__dirname, '../public/Sitemap.xml'), data.toString(), function(err) { 
    if (err) throw err; 
    console.log("Wrote sitemap to XML"); 
}); 
+1

Polecam używanie 'process.chdir()', aby zmienić katalog roboczy aplikacji na __dirname (lub bardziej użyteczną ścieżkę, na przykład używając asar). Umożliwi to korzystanie ze ścieżek względnych bez dodatkowego zamieszania. –

Powiązane problemy