2016-09-12 2 views
0

Ich benutze Knoten 4.5+ und Bluebird. Ich habe den folgenden Code, den ich mit then verwenden wollen:Bluebird Versprechen ist nicht definiert?

var checkdir = function(directory) { 
    return new Promise(function(resolve, reject) { 
     fs.statAsync(directory).then(function() { 
      resolve(true); 
     }).catch(function(err) { 
      if(err.code === 'ENOENT') { 
       fs.mkdirAsync(directory).then(function() { 
        resolve(true); 
       }).catch(function() { 
        reject(new Error('Can not create folder')); 
       }); 
      } else { 
       reject(new Error('Unknown fs stat error: ' + err)); 
      } 
     }); 
    }); 
}; 

Async Funktionen sind von fs-extra-promise Modul. Wenn ich jedoch versuche, diese Funktion zu verwenden, bekomme ich Unhandled rejection Error: Unknown error: TypeError: Cannot read property 'then' of undefined.

Aufruf:

   checkdir(dir).then(function() { 
        ... 
       }).catch(function(err) { 
        reject(new Error('Unknown error: ' + err)); 
       }); 

Was ist hier falsch?

+0

Das ist seltsam, Ihr Code läuft in einem Schnipsel ohne Bluebird finden. Wie implementierst du die Bibliothek? – Randy

+0

Siehe http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

+0

Jede Angabe (Stack-Trace) von denen. dann bezieht sich der Fehler auf? –

Antwort

3

Mit jeder Art von "Existieren" Einchecken Dateisystemoperationen ist actively discouraged in der Node-Dokumentation. (Ob Sie tun besteht die Überprüfung mit stat oder mit exists ist irrelevant.)

Das heißt, zusätzlich zu Benjamin Grünbaum Kommentar bezüglich the improper use of promises in general in Ihrem Code, es ist ein weiterer wichtiger Punkt zu machen:

Der richtige Weg Um ein Verzeichnis zu erstellen, rufen Sie mkdir bedingungslos auf und ignorieren EEXIST (vergleichen Sie this answer für mehr Kontext).

var fs = Promise.promisifyAll(fs); 

var ensureDir = function ensureDir(path) { 
    return fs.mkdirAsync(path).catch((err) => { if (err.code !== 'EEXIST') throw err; }); 
} 

Sie können the mkdirp module verwenden einen Pfad rekursiv zu erstellen, wie mkdir -p würde.

+0

Ich habe Code geändert, aber immer noch einen Fehler: 'Unbehandelte Ablehnung Fehler: Unbekannter Fehler: TypeError: Kann Eigenschaft 'dann' von undefined nicht lesen. Kann es eine weitere Ablehnung des Versprechens sein? – user37741

+0

Es gibt kein '.then()' in meinem Code, also hat der Sie sehen Fehler nichts damit zu tun. – Tomalak

+1

Ich hatte noch ein Versprechen, das Ergebnis der ganzen Kette zu verderben. Vielen Dank! – user37741

Verwandte Themen