gpt4 book ai didi

javascript - 插入前检查 MongoDB 值是否存在

转载 作者:行者123 更新时间:2023-11-30 14:10:10 25 4
gpt4 key购买 nike

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

每次签署请愿书时,都会创建一个像这样的 Mongo 对象:

{ 
"_id" : ObjectId("5c5a47ae8f04f9148f43b033"),
"name" : "John Doe",
"number" : "+18373987466",
"date" : "2/5/19"
}

我已经把number字段变成了一个唯一索引,所以每个电话号码只能有签名。

我遇到的问题是当有人多次尝试在请愿书上签名时该怎么办。我想拦截他们的尝试并向他们发送一条消息,说他们已经签署了请愿书。

在我看来,我有两个选择:

选项 #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 block 尝试了这种方法,但抛出的错误立即使应用程序崩溃。

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 将返回一个游标。你可以使用 collection.count() .但是由于您只对已经存在至少一个值感兴趣,因此您可以调用 cursor.limit(1)

if (collection.find({"number":number}).limit(1).length === 1) 
twiml.message("You have already signed the petition");

选项#2

Is it good software design to knowingly allow your app to throw an error?

没有。我认为这是糟糕的设计。如果该条目已经存在,我不会将其视为错误,而是需要特殊处理的情况。如果您使用 catch(),您仍然需要检查错误类型以向用户发送正确的消息。
假设您的数据库无法访问,因此您无法插入新值,这将是一个(真正的)错误,您应该 catch() 它。

关于javascript - 插入前检查 MongoDB 值是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54610770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com