Node.js 帆';后创建(obj):对象未更新

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

这篇文章有3个更新,可能很长。请参见原始帖子部分

更新3-完整
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();
})