проблема обратного вызова - обратный вызов не является функцией - PullRequest
0 голосов
/ 19 апреля 2020

Я получил такую ​​ошибку: uncaughtException TypeError: cb не является функцией. Я думаю, что эта ошибка вызвана ошибкой обратного вызова, но я не знаю, почему у меня есть эта ошибка.

app.put('/badge/student_badge/:id', upload, (req, res, next) => {
  const name = req.body.name;
  let data = {
    name: name
  }
  badger.updatePersonBadge({
    id: req.params.id
  }, data, (err) => {
    if (err) return next(err);
    res.status(201).json({
      message: 'Post updated successfully!'
    });
  });
});

function updatePersonBadge(options, cb) {
  schemas.badger.then(b => {
    b.findById({
      _id: options.id
    }, (err, resp) => {
      if (err) return cb(err);
      if (!resp) return cb("no badge found");
      name = options.name;
      title = resp.title;
      points = resp.points;

      updateBadge(name, title, points, cb);
      cb(null, resp);
    })
  })
}

function updateBadge(name, title, points, cb) {
  const dateCreated = new Date(),
    dateUpdated = dateCreated;
  registerSchemas.personModel.then(p => {
    p.findOneAndUpdate({
      name: name
    }, {
      $push: {
        badges: [{
          title: title,
          points: points,
          dateCreated: dateCreated,
          dateUpdated: dateUpdated
        }]
      }
    }, (err, resp) => {
      if (err) return cb(err);
      if (!resp) return cb("no person found");
    })
  })
}

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Я предполагаю, что это место, откуда вы звоните updatePersonBadge. Если да, то вы передаете обратный вызов в качестве третьего аргумента. Вы должны использовать их правильно.

badger.updatePersonBadge(
{
   id: req.params.id
}, 
data,
(err) => {
    if (err) return next(err);
    res.status(201).json({
       message: 'Post updated successfully!'
    });
});
0 голосов
/ 19 апреля 2020

В данном примере проблема заключается в несоответствии параметров, вместо обратного вызова вы отправляете данные

app.put('/badge/student_badge/:id', upload, (req, res, next) => {
const name = req.body.name;     
let data = {
    name: name
}
badger.updatePersonBadge({id:req.params.id}, data, (err)=>{.   -- three arguments passed
    if (err) return next(err);
    res.status(201).json({
        message: 'Post updated successfully!'
    });
});

});

Где в определении функции определены только 2 параметра. где должно быть 3 параметра / этот конкретный сценарий должен быть проверен.

0 голосов
/ 19 апреля 2020

Вы не передаете аргумент cb и, если он необязательный (по крайней мере, так кажется), функция пропускает оператор if:

updatePersonBadge(options, cb) {   // << cb (callback) argument expected

  // ...
  cb(null, resp);    // cb called therefore not optional (Its needed)

Если вы используете его как updatePersonBadge(aaa) вместо updatePersonBadge(aaa, myCallbackFn) cb() равен undefined, но выражается в виде вызова функции - он не существует.

Вместо этого вы можете сделать его необязательным (если это так):

  //...
  if(cb) cb(null, resp); // call the cb function if cb argument exists

или если вы хотите быть более точным c:

  //...
  if(cb && typeof cb === 'function') cb(null, resp);

вместо передачи передаваемой функции data:

badger.updatePersonBadge({}, data, errFn);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...