2015-09-10 2 views
-1

Не могли бы вы объяснить, что не так в этом коде ниже.TypeError: Невозможно вызвать метод 'then' of undefined в Nodejs Promises

var promise = fs.readFile(file); 

    var promise2 = promise.then(function(data){ 
     var base64 = new Buffer(data, 'binary').toString('base64'); 
     res.end("success"); 
    }, function(err){ 
     res.end("fail"); 
    }); 

Его метания ошибку как TypeError: Cannot call method 'then' of undefined

+2

' readFile' не возвращает обещание, почему вы думаете, что он делает? – Bergi

+0

Я пытаюсь для шифрования файла base64, как вы можете видеть, но я новичок в обещаниях. Тогда что было бы идеальным для решения этого сценария? – Mithun

+0

@Mithun вы передаете обратный вызов, как описано [здесь] (https://nodejs.org/api/fs.html#fs_fs_readfile_filename_options_callback) Также «но я новичок в обещаниях», может быть, но опять же, нет никаких обещаний Вот. –

ответ

1

Вы должны создать функцию, которая возвращает Async обещание или использовать библиотеку обещание как bluebird.js

Vanilla JS

var promise = readFileAsync(); 
    promise.then(function(result) { 
     // yay! I got the result. 
    }, function(error) { 
     // The promise was rejected with this error. 
    } 

    function readFileAsync() 
    { 
     var promise = new Promise.Promise(); 
     fs.readFile("somefile.txt", function(error, data) { 
      if (error) { 
       promise.reject(error); 
      } else { 
       promise.resolve(data); 
      } 
     }); 

     return promise; 
    } 

С BlueBird.js

var Promise = require("bluebird"); 
var fs = Promise.promisifyAll(require("fs")); 

    fs.readFileAsync("myfile.json").then(JSON.parse).then(function (json) { 
     console.log("Successful json"); 
    }).catch(SyntaxError, function (e) { 
     console.error("file contains invalid json"); 
    }).catch(Promise.OperationalError, function (e) { 
     console.error("unable to read file, because: ", e.message); 
    }); 
+1

Ну, если вы используете Bluebird, вы должны просто использовать 'promsifyAll' – Bergi

2

readFile не возвращает обещание. NodeJS по большому счету предваряет широкое использование обещаний и в основном использует простые обратные вызовы.

Для чтения файла, вы передаете в простой функции обратного вызова, как в этом примере из документации показывает:

fs.readFile('/etc/passwd', function (err, data) { 
    if (err) throw err; 
    console.log(data); 
}); 

Существует promisify-node module доступно, которые оборачивают стандартные NodeJS модулей в посыла с поддержкой API. Пример из его документации:

var promisify = require("promisify-node"); 
var fs = promisify("fs") 
fs.readFile("/etc/passwd").then(function(contents) { 
    console.log(contents); 
}); 

Я хотел бы подчеркнуть, что я не знаю и не использовал его, поэтому я не могу говорить о том, как хорошо он делает свою работу. Похоже, что используется nodegit-promise, a «Внедрение Bares Bones Promises/A + с синхронным обследованием», а не JavaScript Promise (что справедливо, оно предшествует JavaScript Promise на пару лет).

Смежные вопросы