Javascript 插入前检查MongoDB值是否存在
我正在制作一个带有Twilio的应用程序,它允许人们通过在应用程序上发短信来签署在线请愿书。人们只能在请愿书上签名一次。我计划通过每个电话号码只允许一个签名来确保这一点 每次在申请书上签名时,都会创建如下Mongo对象:Javascript 插入前检查MongoDB值是否存在,javascript,node.js,mongodb,express,twilio,Javascript,Node.js,Mongodb,Express,Twilio,我正在制作一个带有Twilio的应用程序,它允许人们通过在应用程序上发短信来签署在线请愿书。人们只能在请愿书上签名一次。我计划通过每个电话号码只允许一个签名来确保这一点 每次在申请书上签名时,都会创建如下Mongo对象: { "_id" : ObjectId("5c5a47ae8f04f9148f43b033"), "name" : "John Doe", "number" : "+18373987466", "date" : "2/5/19" }
{
"_id" : ObjectId("5c5a47ae8f04f9148f43b033"),
"name" : "John Doe",
"number" : "+18373987466",
"date" : "2/5/19"
}
我已经将号码
字段转换为唯一索引,因此每个电话号码只能有签名
我遇到的问题是当有人多次试图在请愿书上签名时该怎么办。我想拦截他们的企图,并向他们发送一条消息,说他们已经签署了请愿书
在我看来,我有两个选择:
选项#1
查询数据库,查看是否已输入相同的号码
这似乎很容易,但我就是不知道怎么做
var number = '+18373987466';
if(collection.find({"number":number}) {
twiml.message("You have already signed the petition");
}
我的想法是,collection.find({“number”:number})
如果找到一个具有相同编号的条目,将返回true
。但是,它返回整个Mongo光标
选项2
由于number
是一个唯一的索引,如果使用相同的值创建另一个对象,Mongo将抛出一个错误。我可以截获抛出的错误,然后向用户发送消息
我对这种方法的第一个问题是:故意允许你的应用程序抛出错误是好的软件设计吗
我用try/catch
块尝试了这种方法,但抛出的错误立即使应用程序崩溃
try {
collection.insertOne(
{name : name, number : number, date: dateSigned},
function(error, result) {
console.log(`${name} has been added to the database`);
});
} catch (error) {
// handle error
}
这不是“捕获”错误并防止其崩溃应用程序的正确方法吗?选项#1
所描述的行为是正确的,如果使用collection.find()
,MongoDB将返回一个游标。你可以用。但是,由于您只对至少有一个值感兴趣,所以可以调用cursor.limit(1)
选项2
故意让你的应用程序抛出错误是一种好的软件设计吗
错误
不,我认为这个设计糟透了。如果条目已经存在,我不认为这是一个错误,而是一个需要特殊处理的案例。如果使用catch()
,您仍然需要检查错误类型,以便向用户发送正确的消息。假设您的数据库无法访问,因此无法插入新值,这将是一个(真实)错误,您应该捕获它。您尝试过使用mongoose吗?当我使用node.js和mongodb时,这通常是我的选择。由于它提供了模式,所以一个独特的字段非常简单。这应该会澄清一些事情。文档实际上相当不错。我对该应用程序的数据库需求非常简单,以至于Mongoose看起来有些过分。条件语句不起作用,因为.limit(1)返回的是Mongo游标,而不是数字。不过,你的建议确实把我引向了正确的方向。我只是切换了count()和limit(),因为count()返回一个数字并提供一个回调。没错,您只需使用db.collection.find().limit(1)。编辑了我的答案。
if (collection.find({"number":number}).limit(1).length === 1)
twiml.message("You have already signed the petition");