【问题标题】:Mongoose FindOne not working猫鼬 FindOne 不工作
【发布时间】:2016-11-11 02:43:25
【问题描述】:

如果我将 dateString 参数作为参数,我会收到来自 Mongoose FindOne 的空响应。我正在使用 nodejs 和猫鼬。

这是我的代码:

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 或有专业人员来完成工作。服务器正在毫无问题地保存服务,但我需要检查刚刚保存的服务的状态,当我输入 dateOpen: dateString 时,我面临着 Service.findOne() 返回空值的问题。

问题是

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

总是返回空值,例如服务不存在。但是,如果我使用 mongo 在提示符下进行相同的查询,我得到了正确的服务。

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

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

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

希望有人可以帮助我,

提前谢谢你!

【问题讨论】:

  • 您将日期保存为字符串。检查它们的格式是否相同。否则,它不会返回所需的结果。我建议将日期保存为日期类型。然后你可以直接在查询中使用 Date() 对象来查找结果。
  • 是的,看看你的文件,以及你的 console.log(dateString) 的结果。随时在您的问题中发布示例。
  • 谢谢各位,刚刚解决了。格式是一样的。

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

问题是node的执行时间比mongo的.save方法快,只是把findProfessional()的调用改成了.save方法的成功回调。像这样:

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

现在,它可以正常工作了。

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2014-08-12
    • 2018-07-22
    相关资源
    最近更新 更多