我正在尝试在服务器端(使用Nodejs)将“骨干”用于“一切”,并且无法进行适当的验证。
问题是backbone的validate方法返回一个布尔值,验证机制应该在它内部实现,但是对于node,这些机制是异步的,因此validate方法在评估我的代码之前返回。
这是一个代码示例,它很好地说明了我的设置:
Backbone.Model.extend({
validate: function(){
var result;
Jobs._withCollection(function(err, collection){
collection.count(query, function(count){
result = count > 1 ? "Job already exist" : null;
});
})
return result;
}
})
我可能会稍微提高一点,但我不确定这是否有效:
function _validate(){
Jobs._withCollection(function(err, collection){
collection.count(query, function(count){
yield count > 1 ? "Job already exist" : null;
});
})
}
Backbone.Model.extend({
validate: function(){
return _validate.call(this);
}
})
特别是对于我使用异步的更复杂的情况,例如,返回值是在async的最后一个回调中设置的,就像这里一样(这显然是错误的,因为res在返回时为null):
Backbone.Model.extend({
validate: function(){
var res;
async.parallel([
.. do stuff ..
], function(err, results){
res = results;
})
return results;
}
})
有什么想法吗?
答案 0 :(得分:1)
异步验证将需要某种方式的异步支持,对于节点意味着validate
将不得不进行回调。您需要将骨干类子类化以支持这一点,或者@Derick说不要在服务器上使用骨干。你会发现另一个不匹配的是,骨干处理成功/失败回调有两个不同的函数,比如jquery,但在node.js中,约定是一个带有可选错误的回调作为第一个位置参数。因此,如果您尝试在服务器上使用Model.save()
之类的东西,则必须在整个地方编写小型适配器函数,以便从jquery样式转换为节点样式的异步错误处理。
我已经在节点中使用Backbone类,但它需要这些类型的适应。