Я использую async.js, чтобы помочь с проверкой и преобразованиями для импорта данных. После перемещения фрагмента кода в его собственную функцию я получаю сообщение об ошибке «Callback уже был вызван». из async.js. Трассировка стека не содержит полезной информации об отладке. Точный код работает нормально, когда я вызываю его напрямую. Мне нужно использовать его для нескольких импортов, поэтому я перешел к объекту, содержащему другие «преобразователи». Все они работают нормально.
Я попытался вставить следующий код в функцию, чтобы попытаться отладить:
return cb("test);
Он работает нормально и возвращает ошибку "test" в браузер, еслиЯ добавляю его в первую строку функции. Вставка его в другое место вызывает ошибку.
Работает следующее. Если я переместлю "return cb (" error); "в строку после let query = ..., то произойдет сбой с ошибкой обратного вызова. Я совершенно запутался.
user(options = {
select: "id",
return: "id",
lean: true,
}) {
return (value, cb) => {
if (!value) {
return cb(null, null);
}
return cb("test");
let query = User.findOne({
$or: [{
email: value.toLowerCase()
},
{
username: value
},
]
}).select(options.select);
if (options.lean) {
query.lean();
}
query.exec((error, user) => {
if (error) {
return cb(error);
}
if (!user) {
return cb(`user not found: ${value}`);
}
if (options.return == "object") {
cb(null, user);
} else {
cb(null, user._id);
}
});
}
}
Переменная" cb "передается из асинхронного вызова:
async.mapValues(self.options.validators, (validators, key, cb) => {
//Get the value that is being validated
var value = _.get(document, key);
var isArray = false;
//Enforce array type
if (!Array.isArray(validators)) {
validators = [validators];
}
//Transform the value before validating it
var transformer = _.get(self.options.transformers, key);
//Don't run transformer if empty value
if (!transformer || value == null) {
transformer = (value, cb) => cb(null, value);
}
transformer(value, (error, newValue) => {
//Check error
if (error) {
return _cb(error);
}
//Set new value
value = newValue;
_.set(document, key, newValue);