Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 插入前检查MongoDB值是否存在_Javascript_Node.js_Mongodb_Express_Twilio - Fatal编程技术网

Javascript 插入前检查MongoDB值是否存在

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" }

我正在制作一个带有Twilio的应用程序,它允许人们通过在应用程序上发短信来签署在线请愿书。人们只能在请愿书上签名一次。我计划通过每个电话号码只允许一个签名来确保这一点

每次在申请书上签名时,都会创建如下Mongo对象:

{ 
  "_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");