Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeError:无法调用方法';然后';Nodejs承诺中未定义的_Javascript_Node.js_File_Callback_Promise - Fatal编程技术网

Javascript TypeError:无法调用方法';然后';Nodejs承诺中未定义的

Javascript TypeError:无法调用方法';然后';Nodejs承诺中未定义的,javascript,node.js,file,callback,promise,Javascript,Node.js,File,Callback,Promise,你能解释一下下面代码中的错误吗 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"); }); 它的抛出错误

你能解释一下下面代码中的错误吗

   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:无法调用未定义的方法“then”

不返回承诺。nodej基本上早于承诺的广泛使用,并且大多使用简单的回调

要读取文件,请传入一个简单的回调,如文档中的示例所示:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});
有一种可用的方法可以将标准NodeJS模块包装到支持承诺的API中。其文档中的示例:

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

我应该强调的是,我不知道它,也没有使用过它,所以我不能说它的工作做得有多好。它似乎使用的是“带同步检查的基本承诺/a+实现”,而不是JavaScript的
承诺(这是公平的;它比JavaScript的
承诺早几年)。

您必须创建一个异步函数来返回承诺或使用类似的承诺库

香草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);
    });

readFile
不返回承诺,为什么您认为它会返回?正如您所看到的,我正在尝试对文件进行base64加密,但我对承诺不熟悉。那么,处理这种情况的理想方法是什么呢?@Mithun您传入了一个回调,正如所描述的“但我对承诺是新的”,也许,但这里没有承诺。@Mithun:请看一看,如果您使用的是蓝鸟,您只需使用
promsifyAll