gpt4 book ai didi

javascript - 保护我的非规范化 Meteor 评级系统

转载 作者:行者123 更新时间:2023-12-03 11:48:23 25 4
gpt4 key购买 nike

这是一个(对我来说)艰难且冗长的:

我正在接受整个 Mongo 非规范化的事情。我创建了一个评级系统,用户可以对彼此的视频进行评级。要获得视频的平均分数,每次用户“评论”视频时(使用meteor.methods upsert),都会将 0 到 10 之间的数字直接添加到视频文档(在名为“Entries”的集合中)的分数字段中。 )。当然,条目的平均分数是所有评分的总和除以评论总数。无论如何,我都会在单独的集合中保存每条评论的记录。

我的问题是......我不知道如何安全地写这个。确实没有什么可以阻止某人将大于 10 或小于 0 的数字添加到总和中(或重复添加可接受的数字)。

你能帮忙吗?也许如果我说“如果您尝试将评论总和更新为(在条目文档中)的新数字不等于存储在评论集合中的该条目的所有评论的总和,则抛出一个错误”。 ..加上你的最新分数。”但如果这是正确的,那到底是怎么写的呢?

这是共享的客户端/服务器代码:

//update reviews
Meteor.methods({
reviewUpsert: function(id, doc) {
if (!this.userId) {
throw new Meteor.Error(403, "You must be logged in to do that.");
}
if (Meteor.users.findOne(this.userId).emails[0].verified !== true) {
throw new Meteor.Error(403, "Your email must be verified to review. Check your email inbox.")
}
if (Meteor.user().status === "suspended") {
throw new Meteor.Error(403, "Cannot perform this action while account is suspended.")
}
var review = Reviews.findOne(id);
if (review && doc.reviewer !== this.userId) {
throw new Meteor.Error(403, "You don't own that review.");
}
if (doc.reviewer !== this.userId) {
throw new Meteor.Error(403, "Cannot create a review for someone else.");
// alternatively, just set doc.owner = this.userId
}
Reviews.upsert(id, doc);
}
});

//update entry score
Meteor.methods({
entryScoreUpdate: function(id, doc) {
Entries.update(id, doc);
}
});

这是相关的客户端代码:

  Meteor.call('reviewUpsert',
Reviews.findOne({unique_review: reviewer_and_entry}, {}, function(err, result){
if (result) {
return result._id;
}
if (!result) {
return null;
}
}),
{date: new Date(), reviewer: Meteor.userId(), entry: Session.get('entryId'), title: entrytitle.title, unique_review: reviewer_and_entry, reviewername: Meteor.user().username, review: reviewfield, score: parseInt(scorefield)}, function(err){
if (err)
Alerts.add('Review error: ' + err.reason, 'warning');
else {
var reviewAdd = parseInt(scorefield) - lastscore;
Meteor.call('entryScoreUpdate',
{_id: Session.get('entryId')}, {$inc: {reviewsum: reviewAdd, reviewcount: incCount}},
function(err){
if (err)
Alerts.add('Review error: ' + err.reason, 'warning');
else {
var entryforavg = Entries.findOne(Session.get('entryId'));
Meteor.call('entryScoreUpdate',
{_id: Session.get('entryId')}, {$set: {avgScore: Number(((entryforavg.reviewsum/entryforavg.reviewcount)*10).toFixed(2))}},
function(err){
if (err)
Alerts.add('Review error: ' + err.reason, 'warning');
else {
Alerts.add('Review has been updated.', 'success'),
Session.set("formStatus", 'oldForm');
}
}
);
}
}
);
}
}
);

最佳答案

这个怎么样:

Meteor.methods({
reviewUpsert : function(id, doc){
...
if( (doc.rating > 10) || (doc.rating < 0) ){
throw new Meteor.Error( ... )
}
}
})

至于阻止同一用户重复输入评分,您必须跟踪哪些用户对哪些视频评分并更新他们的评分,而不是简单地盲目添加新评分。

关于javascript - 保护我的非规范化 Meteor 评级系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948842/

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