回调问题-回调不是函数

时间:2020-04-18 21:12:29

标签: javascript express

我收到这样的错误: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 :(得分:0)

您没有传递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

或者如果您想更具体一点:

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

您传递的是data,而不是传递函数:

badger.updatePersonBadge({}, data, errFn);

答案 1 :(得分:0)

我假设这是您调用updatePersonBadge的地方。如果是,那么您要将回调作为第三个参数传递,则必须正确使用它们。

badger.updatePersonBadge(
{
   id: req.params.id
}, 
data,
(err) => {
    if (err) return next(err);
    res.status(201).json({
       message: 'Post updated successfully!'
    });
});

答案 2 :(得分:0)

在此示例中,问题是参数不匹配,您可以代替回调发送数据

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个参数/应该验证特定方案。