使用populate with mongoose时出现捕获错误

时间:2017-05-20 15:34:51

标签: node.js mongoose

我有下一个模型和路线与mongoose:

在我的收集中,我有一些invalids id到“cidade”字段,这就是为什么我收到下面显示的错误。

错误发生在以下行中:

.populate('cidade')

有没有办法在:

执行我的路由器(代码如下)
router.get('/:id',function(req,res,next){  .....

不停止该错误? 如果找到无效的“id”,我只想忽略它并继续下一步。

我的收藏品太大,可能会有一些残疾人“ids”到“cidade”字段。

//错误

angular.js:14328 Possibly unhandled rejection: {"data":{"message":"Cast to ObjectId failed for value \"Ararendá\" at path \"_id\" for model \"Cidade\"","name":"CastError","stringValue":"\"Ararendá\"","kind":"ObjectId","value":"Ararendá","path":"_id"},"status":500,"config":

//模型和路线

// CIDADE

cidadesSchema = new mongoose.Schema({
  uf: {type: String, unique:true},
  cidade: {type: String, unique:true}
});

module.exports = mongoose.model('Cidade', cidadesSchema,'cidades' );

// profiss

var profissionaisSchema = new mongoose.Schema({
  nome: {type: String, unique:true},
  cidade: {type:mongoose.Schema.Types.ObjectId, ref:'Cidade'},
  estado: {type:mongoose.Schema.Types.ObjectId, ref:'Estado'},
  cep: {type: String},
});

module.exports = mongoose.model('Profissional', profissionaisSchema,'profissionais' );

//路线

const callback=function(err,data,res){
     if (err) return res.status(500).json(err);
     return res.status(200).send(data);
}   
router.get('/:id',function(req,res,next){   
    const query=req.params.id;
    Profissional.findById(query).populate('profissao')
    .populate('cidade')
    .exec( (err,data) => {
       callback(err,data,res)
    });
});

1 个答案:

答案 0 :(得分:2)

我不认为你可以告诉Mongoose只是忽略那些继续前进的错误,所以你必须自己实现这个人群(这应该相对容易因为您使用的findById最多只会产生一个文档。

这里有一些(未经测试的)代码:

Profissional.findById(query).populate('profissao').exec( (err, profi) => {
  if (err) {
    return res.status(500).json(err);
  } else if (! profi || ! /^[a-f0-9]{24}$/i.test(profi.cidade)) {
    return res.status(200).send(profi);
  }
  Cidade.findById(profi.cidade).exec((err, cidade) => {
    if (err) {
      return res.status(500).json(err);
    }
    profi.cidade = cidade;
    return res.status(200).send(profi);
  });
});

如果cidade属性看起来像一个有效的ObjectId,它将运行一个查询来检索它,否则它不会打扰。