2015-02-18 4 views
11

Provare a scrivere su un file utilizzando fs.writeFile in una directory di pari livello. Funziona perfettamente quando si utilizza Sitemap.xml nella stessa directory, ma non con il percorso relativo. La directory public esiste e restituisce lo stesso errore indipendentemente dal fatto che esista o meno Sitemap.xml.Errore ENOENT quando si utilizza fs.writeFile

Rilevante struttura dir:

/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

Come si presenta la struttura della cartella del progetto? –

+0

Ho aggiunto i dettagli – Tom

risposta

17

Quando si utilizzano percorsi relativi a nodo, sono in relazione al processo di nodo. Quindi, se esegui il tuo script come node create-sitemap/index.js dalla directory /Users/tomchambers/projects/project/, cercherà il file /Users/tomchambers/projects/public/Sitemap.xml, che non esiste.

Nel tuo caso, è possibile utilizzare la variabile __dirname globale, che restituisce, as the docs say:.

Il nome della directory che lo script in esecuzione risiede a

Così il vostro codice dovrebbe assomiglia a questo:

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

Ti consiglio di usare 'process.chdir()' per cambiare la directory di lavoro della tua app su __dirname (o un percorso più utile, se per esempio si usa asar). Ciò ti consentirà di utilizzare percorsi relativi senza problemi. –