简体   繁体   English

JavaScript回调函数不起作用

[英]Javascript callback function not work

I'm working with nodeJS and expressJS. 我正在使用nodeJS和expressJS。 I Have 2 functions, main functions: 我有2个功能,主要功能:

download(imgUrl, imgMD5, function(fileLength, fileSize) {
    console.log(fileLength);

    var qb = data.Img.query();
    qb.where('img_md5', '=', imgMD5).update({
        img_downloaded: 1
    }).then(function() {});
});

and external function 和外部功能

module.exports = function() {
    return function(uri, filename) {
        request(uri, function(err, res, callback) {
            fileLength = res.headers['content-length'];
            var mkdirs = function(fold, callback) {

                var pf = path.dirname(fold);

                fs.exists(pf, function(exists) {
                    var create = function() {

                        fs.mkdir(fold, callback);
                    };
                    if (exists) {
                        create();
                    } else
                        mkdirs(pf, create);
                })
            };
            var folder = ('./downloaded/' + yy + '/' + mm + '/' + dd + '/' + ho + '/');

            mkdirs(folder, function() {
                var r = request(uri).pipe(fs.createWriteStream(folder + filename));
                r.on('close');
            });
            callback(fileLength);
        });
    };
};

but it's fired an error when running: 但是在运行时会引发错误:

TypeError: string is not a function TypeError:字符串不是函数

I don't know if I'm uses the callback right or not? 我不知道我是否正确使用了回调?

thank you 谢谢

Your request() callback parameters aren't quite labelled appropriately. 您的request()回调参数标记不正确。 The third argument passed to your callback is the entire buffered (string) body from the response, not a function. 传递给回调的第三个参数是响应中整个缓冲区(字符串)的主体,而不是函数。 So that's why it complains at callback(fileLength); 这就是为什么它抱怨callback(fileLength);的原因callback(fileLength); .

Also, because you used a callback (which receives the entire buffered response), there is no need to request the URL again. 另外,由于您使用了回调(接收整个缓冲的响应),因此无需再次请求URL。 So you could change this: 因此,您可以更改此设置:

mkdirs(folder, function(){
  var r = request(uri).pipe(fs.createWriteStream(folder + filename));
  r.on('close');
});

to this: 对此:

mkdirs(folder, function() {
  // `data` here is the third argument to the `request()` callback ...
  fs.writeFile(folder + filename, data);
});

to save an extra HTTP request. 保存额外的HTTP请求。

Or if you really do want to stream the response data, you could do: 或者,如果您确实希望流式传输响应数据,则可以执行以下操作:

request(uri).on('response', function(res) {
  // ...

  mkdirs(folder, function() {
    res.pipe(fs.createWriteStream(folder + filename));
  });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM