miv-men
@miv-men
Фронт и бэк

Node.js ошибка ERR_INVALID_CALLBACK в файле timers.js как устранить?

Здравствуйте!

С помощью node конвенктирую фотографии на сайте в webp, скрипт работает, но при большом количестве фотографий сервер не справляется и Load Average начитает стремительно рости.
Решил установить паузу между конвертацией фотографий с помощью setTimeout(), после чего появилась ошибка [ERR_INVALID_CALLBACK]: Callback must be a function.

Проблемный скрипт:
var path = require('path');
var fs = require('fs');
var async = require('async');
var webp=require('webp-converter');

function getFiles (dirPath, callback) {

    fs.readdir(dirPath, function (err, files) {
        if (err) return callback(err);

        var filePaths = [];
        async.eachSeries(files, function (fileName, eachCallback) {
            var filePath = path.join(dirPath, fileName);

            fs.stat(filePath, function (err, stat) {
                if (err) return eachCallback(err);

                if (stat.isDirectory()) {
                    getFiles(filePath, function (err, subDirFiles) {
                        if (err) return eachCallback(err);

                        filePaths = filePaths.concat(subDirFiles);
                        eachCallback(null);
                    });

                } else {
                    if (stat.isFile() && /dr5-220-[0-9]_1.jpg$/.test(filePath)) {
                        filePaths.push(filePath);
                    }

                    eachCallback(null);
                }
            });
        }, function (err) {
            callback(err, filePaths);
        });

    });
}


getFiles('/data/upload/allfoto', function (err, files) {

    for(var i=0; i<files.length; i++){

        function ChangePhoto(foto){
            console.log(foto);
            fs.access(foto + ".webp", function (error) {
                if (error != null) {
                    webp.cwebp(error.path.slice(0, -5), error.path, "-q 70", function (status, error) {
                        //if conversion successful status will be '100'
                        //if conversion fails status will be '101'
                        // console.log(status,error);
                    });
                }
            });
        }


        setTimeout(ChangePhoto(files[i]), 300);
    }
});


Ошибка при запуске скрипта:
timers.js:390
    throw new ERR_INVALID_CALLBACK();
    ^

TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
    at setTimeout (timers.js:390:11)
    at /data/git-project/path.js:60:9
    at /data/git-project/path.js:35:13
    at /data/git-project/node_modules/async/dist/async.js:473:16
    at replenish (/data/git-project/node_modules/async/dist/async.js:1006:25)
    at iterateeCallback (/data/git-project/node_modules/async/dist/async.js:995:17)
    at /data/git-project/node_modules/async/dist/async.js:969:16
    at /data/git-project/path.js:31:21
    at FSReqWrap.oncomplete (fs.js:154:5)
  • Вопрос задан
  • 341 просмотр
Решения вопроса 1
@h88p
Pre-Junior HTML Developer
Попробуйте так
setTimeout(() => { ChangePhoto(files[i]) }, i * 300);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
smilingcheater
@smilingcheater
Потому что вы первым параметром в setTimeout передаёте не функцию, а результат вызова функции ChangePhoto(files[i]).
И кстати, в таком виде у вас обработка фото будет не подряд с задержкой 300мс между вызовами, а все обработчики запустятся разом через 300мс после цикла. Но в силу однопоточности ноды будут всё равно выполнятся подряд друг за другом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы