Node.js 主干、节点和Mongo错误验证和通信
我试图解决以下两个问题:Node.js 主干、节点和Mongo错误验证和通信,node.js,mongodb,validation,backbone.js,error-handling,Node.js,Mongodb,Validation,Backbone.js,Error Handling,我试图解决以下两个问题: 在model.save()上,确保条目不是Mongo中现有条目的副本。如果是,则显示UI错误 在model.save()之前,对字段输入进行验证,以确保没有像空白字段+显示UI错误这样有趣的事情 首先是设置 通过节点的Mongo模式。 // setup Server, include mongoose, connect to db var List = new Schema({ titleKey: { type: String,
model.save()
上,确保条目不是Mongo中现有条目的副本。如果是,则显示UI错误model.save()之前,
对字段输入进行验证,以确保没有像空白字段+显示UI错误这样有趣的事情// setup Server, include mongoose, connect to db
var List = new Schema({
titleKey: {
type: String,
lowercase: true,
trim: true,
index: {
required: true,
unique: true,
dropDups: true
}
},
title: String
});
用于保存列表的API端点
app.post('/api/lists', function(req, res){
var list = new ListModel({
titleKey: generateTitleKey(req.body.title),
title: req.body.title,
});
return list.save(function(err){
if(!err) {
console.log('saved list');
return res.send(JSON.stringify(list));
} else {
console.log(err);
return res.send(JSON.stringify({
err: true,
errSrc: "list",
errType: "insert",
errMsg: "That's already a list!"
}));
}
});
});
最后,模型视图的主干.save()方法
save: function() {
/* this is called from a lightbox that might be creating a new list, or editing an existing one, so there may already be a model pre-loaded into this point. */
var _self = this;
newTitle = _self.$el.find('input[name="new-list-name"]').val();
// create model
_self.opts.model = new app.AchievementList({
title: newTitle,
});
_self.opts.model.save(null, {
wait: true,
success: function(model, res) {
new app.AchievementListView({ model: _self.opts.model });
},
error: function(model, error) {}
});
},
这就是我战略崩溃的地方
主干网.save({success/error})
在侦听Mongo错误输出时,行为不符合预期
理想情况下,我希望Mongo执行重复错误处理。它已经检测到重复项并抛出错误,为什么不呢。但是后来我发现,来自API的任何回复都被视为成功:
在.save()
方法中的响应,因此即使出现错误,视图也会被呈现,因为触发了技术上的成功。我是否在成功:
内执行错误检查?看起来这就是错误:
的作用,但是我会抛出服务器错误响应(比如501)来强制执行错误:
处理程序,并且501会显示在控制台中。这似乎不对,根本不是“我无法到达服务器”
我想到的另一种方法是运行一个wrapping$.ajax(GET)
请求,查找重复条目,然后相应地执行操作。但如果我这么做,为什么还要麻烦问Mongo来防止重复?我永远不会提交一份副本,如果我提交了,我也不会知道,没有什么可以抓住这个错误。感觉好像我错过了Mongos强大的错误处理功能,在需要服务器提供任何信息时,我会进行各种随机的ajax调用和API查找。不好
Backbonesmodel.validate()
方法不适合检查输入错误并简单地中断保存流程
save: function() {
/* this is called from a lightbox that might be creating a new list, or editing an existing one, so there may already be a model pre-loaded into this point. */
var _self = this;
newTitle = _self.$el.find('input[name="new-list-name"]').val();
// create model
_self.opts.model = new app.AchievementList({
title: newTitle,
});
_self.opts.model.save(null, {
wait: true,
success: function(model, res) {
new app.AchievementListView({ model: _self.opts.model });
},
error: function(model, error) {}
});
},
但是好吧,假设我在success:
中解析响应,并阻止view.render()
。好的当我在提交前验证输入字段时,我又碰到了另一面墙。Backbonesvalidate
方法做了一件奇怪的事情,您必须倾听模型的“无效”更改。问题是运行model.save()
的部分在初始化时并不总是在视图中有一个模型,所以我无法将侦听器绑定到可能不存在的部分。因此,通常要做的就是用一个通用的if-else
check手动检查字段,但这看起来不像。MV的全部要点是模型应该处理它们自己的错误等等,所以如果我在它们之外方便的地方进行验证。。。这似乎有点不对劲。在保存({success:})
中强制执行错误检查也是如此
我知道从技术上讲,这是很多抱怨和抱怨,但我学习这些东西的全部意义在于我想知道如何正确处理它们。我知道这里提到的所有3个框架都有强大的工具来处理常见的需求,比如验证,所以我忍不住觉得我缺少了一些解决这些典型问题的常识性方法。如果有人能给我任何关于这些问题的见解,我将不胜感激。同时解决这些问题真的很痛苦 这里的问题是,无论服务器中的错误状态如何,API端点都返回200(成功)。它应该返回与错误类型匹配的适当错误代码,以便主干截获错误。例如,对于重复记录,通常的做法是返回409冲突(请参阅)。 假设您将express与node.js一起使用,则在发送响应之前,可以通过以下方式发送状态:
...
res.status(409);
...
return res.send(...
然后,在主干模型上,作为模型事件的一部分实现错误侦听器:
MyModel = Backbone.Model.extend({
...
events: {
'error': 'errorHandler',
},
...
errorHandler: function(error) {
// do something with that error
}
});
然后,您的模型可以发送视图将捕获的事件,以便向用户显示相应的错误消息。您还可以执行一个很酷的单行程序
返回res.status(409)。发送(…)
如果我开始从服务器返回409,我担心的是,这将开始将所有错误记录到控制台中。重复条目是UI中经常发生的事情,在普通应用程序中有一个充满服务器响应代码的控制台可以吗?完全可以。现在,你可能想开发你的客户端应用程序,这样它就不会生成那些坏的请求,这很奇怪,但是如果我首先设置客户端应用程序来防止坏的请求(我肯定想到了这种方法),那么为什么要让Mongo先做它的条件呢。当我了解到唯一键和重复键时,它似乎是测试错误的主要方法。这更像是一种“以防所有其他错误检查失败”类型的交易吗?不管怎样,谢谢你的回答。大帮助。你的服务器应该随时准备处理错误,因为它传入的请求不一定来自你的客户端应用(你可以有几个客户端应用使用同一个服务器应用)。无论客户端应用程序是如何设计的,服务器都应该处理所有情况。