2017-06-20 150 views
-2

我的问题是关于检查数据库中是否存在员工的姓名或电子邮件。他们说在更新前的中间件中做它很好。我尝试过,但它不工作。如何检查数据库中是否存在字段?

我将(id_of_staff,updatedStaff_info和callback_function)传递给更新函数。

这是我的更新功能:

module.exports.updateStaff = function(id, updatedStaff, callback){ 
var query = {_id: id}; 

    Staff.update(query, updatedStaff, callback); 

}

每次的Staff.update()被调用的预更新中间件执行。我想要的是检查名称或电子邮件是否已经存在。问题是,预更新中间件中的名称和电子邮件似乎未定义。

我的预更新中间件:

staffSchema.pre("update", function(next){ 

var staff = this; 
Staff.find({_id:{$ne: staff.id}, $or:[{name: staff.name}, {email: staff.email}]}, function (err, docs) { 

    if (!docs.length){ 
     next(); 
    }else{     
     next(new Error("Name or email already exist")); 
    } 
}); 

});

我得到的结果始终是“名称或电子邮件已存在”。我试图在控制台日志中打印staff.name的值,但它表示未定义。我做对了吗?你能帮我解决问题吗?非常感谢你们。

+1

请给你的问题一个更好的标题,描述问题的标题。 – Li357

+0

您的问题标题应该描述您遇到的问题或您问的问题。你刚接触猫鼬的事实是无关紧要的,显然询问你是否能够获得帮助是没有意义的。这是本网站存在的全部目的。您的标题应该以对未来的读者在搜索结果中有意义的方式清楚地描述问题。 –

+0

也不要在问题标题中使用标签名称。这就是标签的用途。然而,这个问题缺乏你作为参数发送的内容的详细信息,以及你实际期望的匹配或不匹配。最可能的原因是给定的条件将始终与数据中的某些内容匹配。这是由你来表明你认为它不应该。请参阅[如何创建最小,完整和可验证示例](https://stackoverflow.com/help/mcve) –

回答

0

我找到了解决我的问题。而不是使用预更新中间件,我只是创建一个函数来检查名称或电子邮件是否已经存在。

下面的代码:

module.exports.updateStaff = function(id, updatedStaff, callback){ 
var query = {_id: id}; 

//check name and email if already available 
function updateStaff(id, updatedStaff, callback){ 
    //get staff that has the same name or email 
    Staff.find({_id:{$ne:id}, $or:[{name: updatedStaff.name}, {email_pc: updatedStaff.email_pc}]}).exec(
     function(err, result){ 
      console.log(result); 
      if(!err){ 
       if(result.length){         
        console.log("Name or email already exist."); 
        callback("Conflict", null); 
       } 
       else{ 
        //udpate the staff 
        Staff.update(query, updatedStaff, callback); 
       } 
      }else{ 
       callback(err); 
      } 

     }) 
} 

updateStaff(id, updatedStaff, callback); 

}

但我还是打开使用预更新的中间件来回答。谢谢:)

+0

'result.length'不正确,因为'0'实际上是'true'。你的正确的行应该是'if(result.length> 0)'或者甚至更有效地在你的查询中包含一个'.limit(1)',这样你就不会不必要地要求数据库返回比第一个更多的结果一个发现。 –