Mongoose FindOne无法正常工作

时间:2016-11-10 18:27:36

标签: javascript node.js mongodb mongoose

如果我将参数设为dateString参数,我将从Mongoose FindOne获得null响应。我正在使用nodejs和mongoose。

这是我的代码:

var Service = app.models.service;
controller.newService = function(req, res) {
var date = new Date();
var dateString = date.toString();
var countHours = 1;
var user = req.decoded;
var findProfessional = function(){
    console.log(countHours);
    console.log(user._doc._id);
    console.log(req.body.service[0].tipo);
    console.log(dateString);
    Service.findOne({
      tipo: req.body.service[0].tipo,
      client: user._doc._id,
      dateOpen: dateString
    }, function(err, service) {
      console.log(service);
      if (err) throw err;

      if (!service) {
        console.log("service not found");
      } else if (service) {
        if (service.status == 'open' && countHours <= 24) {
          setTimeout(function(){
            Professional.find({
              'services.name': req.body.service[0].tipo
            }, function(err, professional) {
              if (err) throw err;

              if (professional) {
                DO STUFF                      
              } else {
                DO STUFF
                res.json({ success: false, message: 'No professionals found' });
              };
            });
            countHours++;
            findProfessional();
          }, 10000);
        } else if (service.status != 'open'){
          // DO STUFF
        } else if (countHours > 24){
          //DO STUFF
        }
      }
    });
  };

这是我的架构:

var schemaServices = mongoose.Schema({
    tipo: {
        type: String,
        required: true
    },
    client: {
        type: String,
        required: true
    },
    dateOpen: {
        type: String,
        required: true
    },
    dateClose: {
        type: String,
    },
    professional: {
        type: String
    },
    status: {
        type: String,
        required: true
    },
    services: {
        type: [{name: String,
            preco: String,
            tipo: String,
            tipoCusto: String,
            pedido: String}],
        required: true
        },
    visitDay: {
        type: String
    },
    visitHour: {
        type: String
    },
    address: {
        type: [{cep: String,
            street: String,
            number: String,
            comp: String,
            district: String,
            city: String}],
        required: true
    }
    });

schemaServices.index({client: 1, tipo: 1, dateOpen: 1}, {unique: true});

我的代码是做什么用的?

当对此路线发出请求时,节点会保存新服务并寻找专业人员来完成这项工作。它一直在寻找,直到计时器countHours达到24或有专业人员来完成工作。服务器正在保存服务没有问题,但我需要检查刚刚保存的服务的状态,并且我遇到Service.findOne()的问题,当我输入dateOpen:dateString时返回空值。

问题是

 Service.findOne({
      tipo: req.body.service[0].tipo,
      client: user._doc._id,
      dateOpen: dateString
    }

总是返回一个null值,就像服务不存在一样。但是如果我使用mongo在提示中进行相同的查询,我得到了正确的服务。

我做了一些测试并观察了一些事情:

- console.logs正在打印它应该打印的内容 - 当我从Service.findOne()中的参数中删除dateOpen:dateString时,它可以正常工作

所以,我认为错误与dateString有关,但我看不出它是什么。

希望有人可以帮助我,

提前谢谢!

1 个答案:

答案 0 :(得分:0)

刚刚解决了我自己的问题。

问题是节点的执行时间比mongo的.save方法快,只是将findProfessional()的调用改为.save方法的成功回调。像那样:

     newService.save(function(err){
    if (err) throw err;
    console.log('Service saved successfully');
    newService.save(findProfessional())
  });

现在,它正常工作。