JavaScript回调函数不起作用

修理工

我正在使用nodeJS和expressJS。我有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() {});
});

和外部功能

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

但是在运行时触发了一个错误:

TypeError:字符串不是函数

我不知道我是否正确使用了回调?

谢谢你

mscdex

您的request()回调参数标记不正确。传递给回调的第三个参数是响应中整个缓冲区(字符串)的主体,而不是函数。这就是为什么它抱怨的原因callback(fileLength);

另外,由于使用了回调(接收整个缓冲的响应),因此无需再次请求URL。因此,您可以更改此设置:

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

对此:

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

保存额外的HTTP请求。

或者,如果您确实要流式传输响应数据,则可以执行以下操作:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章