Node.js 帆';后创建(obj):对象未更新
这篇文章有3个更新,可能很长。请参见原始帖子部分 更新3-完整Node.js 帆';后创建(obj):对象未更新,node.js,sails.js,waterline,Node.js,Sails.js,Waterline,这篇文章有3个更新,可能很长。请参见原始帖子部分 更新3-完整Annoncecode 请注意,这是我当前的代码。我已经更新了url()方法,并对afterCreate()中的所有内容进行了注释。但是代码还是一样的。(对不起,这只是复制粘贴,所以评论是用法语写的) 更新1-使用Annonce.find()方法 我已经更新了Model.afterCreate()以获取数据库中新创建的记录 afterCreate: function(attrs, next) { // slug must be
Annonce
code
请注意,这是我当前的代码。我已经更新了url()
方法,并对afterCreate()中的所有内容进行了注释。但是代码还是一样的。(对不起,这只是复制粘贴,所以评论是用法语写的)
更新1-使用Annonce.find()
方法
我已经更新了Model.afterCreate()以获取数据库中新创建的记录
afterCreate: function(attrs, next) {
// slug must be unique
var slug = attrs.titre_annonce.replace(/\s+/g, '-').toLowerCase();
// Let's search for a classified that would have such a slug
// If we don't find, we can do
// this.slug = slug;
// If we find sthg, we must get a unique string.
// this.slug = slug + '_' + this.id
// This would fit.
// findOne() <--- because we only want to see if there's sthg
Annonce.findOne({slug: slug}, function(err, ann) {
if (err) {
sails.log.error(err);
next(err);
}
else if (!ann) {
// We didn't find any, so .slug is simple
Annonce.findOne({id:attrs.id}, function(error, object){
sails.log.error('Infinite loop ? (1)');
if (error) next(error);
else {
sails.log.error('Infinite loop ? (3)');
object.slug = slug;
object.save(function (err) {
sails.log.error('Infinite loop ? (4)');
next();
});
}
});
} else {
// We found sthg, so slug is not unique.
Annonce.findOne({id:attrs.id}, function(error, object){
sails.log.error('Infinite loop ? (2)');
if (error) {
sails.log.error('SAVE ERROR');
next(error);
} else {
object.slug = slug + '_' + attrs.id;
sails.log.error('SAVE OK');
object.save(function (err) {
next();
});
}
});
}
});
},
错误:obj
没有save()
方法。但不使用。save()
结束时不更新数据库
您认为如何?在您的示例中,“obj”不会附加save方法。如果需要save方法,则需要重新实例化该对象。假设“obj”来自“模型”
例如:
afterCreate : function(obj,next){
Model.findOne(obj.id, function(err, objectWithSaveMethod){
.....
}
}
或者,您可以使用
Model.update({slug:slug}, {id:obj.id}, function(err, object){
if(err) next(err);
next();
})
我有。你没有看到无限循环?(4)
?真奇怪。尝试使用Annonce.update({id:id:attrs.id},{slug:slug}).exec(…)
而不是object.save()
,看看会发生什么?我确认没有看到无限循环?(4) Annonce.findOne()
中的和object.save()
。现在,正如您和@Meeker所建议的,我已将其替换为Annonce.update()
,但它仍然挂起。我还添加了关于我的问题的想法。我进一步选择了.url()实例方法中的instance方法。问题:在实例方法中,此
传递到模型中的未定义
。findOne({},function(){/*HERE!*/})
范围。我想这次可能是个bug。我通过将这个
复制到obj
变量中来解决问题。您的示例代码(来自更新1)非常适合我。您使用的是什么数据库?您建议的解决方法是正确的,但是.afterCreate()
的预期行为是保存对象(请参阅)。你怎么想?我不知道为什么这是预期的行为。我在文件里找不到这样的内容。你能告诉我它说你应该在哪里做这件事吗?如果我调查一下Waterline开发人员所做的工作,然后?我已经克隆了git Waterline并运行了测试套件。不知道这是否链接,但测试未通过,并且存在错误。也许是其他原因。该测试只是证明,在对象返回给调用它的控制器之前,您可以对其进行操作,而不是将其保存回数据库。
afterCreate: function(obj, next) {
// slug field must be unique
var slug = obj.titre_annonce.replace(/\s+/g, '-').toLowerCase();
// Let's search for a classified that would have such a slug
// If we don't find, we can do
// this.slug = slug;
// If we find sthg, we must get a unique string.
// this.slug = slug + '_' + this.id
// This would fit.
// findOne() <--- because we only want to see if there's sthg
Annonce.findOne({slug: slug}, function(err, ann) {
if (err) {
sails.log.error(err);
next(err);
}
else if (!ann) {
// We didn't find any, so .slug is simple
obj.slug = slug;
obj.save(function(err){
next();
});
} else {
// We found sthg, so slug is not unique.
obj.slug = slug + '_' + obj.id;
obj.save(function (err) {
next();
});
}
});
afterCreate : function(obj,next){
Model.findOne(obj.id, function(err, objectWithSaveMethod){
.....
}
}
Model.update({slug:slug}, {id:obj.id}, function(err, object){
if(err) next(err);
next();
})