В приведенном ниже коде из multer API две функции cb принимают значение null в качестве первого аргумента. Каково значение нуля и какие другие значения могут быть использованы здесь, кроме нуля?

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})

var upload = multer({ storage: storage }
2
user3425506 1 Май 2019 в 00:15

3 ответа

Лучший ответ

Асинхронные функции, которые принимают обратный вызов, часто форматируют обратный вызов так, что первый аргумент, предоставленный для обратного вызова, является ошибкой, если обнаружена какая-либо ошибка, а вторым аргументом является успешное извлеченное значение (если ошибка не обнаружена). Это именно то, что здесь происходит. Если destination или filename связаны с чем-то, что может вызвать ошибку, то первый аргумент, который вы передаете cb, может быть ошибкой, например:

destination: function (req, file, cb) {
  if (!authorized) {
    cb(new Error('You are not authorized to do this!'));
    return;
  }
  cb(null, '/tmp/my-uploads')
}

Причина заключается в том, что, если первый аргумент является ошибкой, модуль, который передает cb, поощряется к использованию и проверке первого аргумента, что позволяет правильно обрабатывать ошибки.

Например, если ошибка была передана в качестве аргумента second , то ленивым программистам было бы просто проигнорировать ее и определить обратный вызов так, чтобы он смотрел только на первый аргумент.

3
CertainPerformance 3 Дек 2019 в 12:10

Это шаблон обратного вызова с ошибкой, созданный в первые годы существования ядра и библиотек Node.JS в его экосистеме. Это все еще распространенная модель, но в основном она связана с такими вещами, как обещания или асинхронность / ожидание. Вот соответствующий раздел из документов Node.JS https://nodejs.org/api/errors .html # errors_error_first_callbacks.

Другой параметр, отличный от null, будет экземпляром некоторого типа Error.

1
djfdev 30 Апр 2019 в 21:21

null означает, что ошибки не было, и вы вызываете функцию обратного вызова с успешным завершением и полученным значением.

Соглашение об асинхронном обратном вызове node.js предназначено для обратного вызова, который принимает два параметра, которые выглядели бы так, если бы это была объявленная функция:

function someCallbackFunction(err, value) {
    if (err) {
        // process err here
    } else {
        // no error, process value here
    }
}

Первый параметр - это ошибка (null, если ошибки нет, обычно это экземпляр объекта Error, если есть ошибка). Второе значение (если ошибки не было).

Таким образом, вы передаете null в качестве первого аргумента, если ошибки нет, а второй аргумент будет содержать ваше значение.

К вашему сведению, для этого стиля обратного вызова есть node.js документация.

1
jfriend00 30 Апр 2019 в 21:26