2015-03-24 3 views
0

Я знаю, что были похожие вопросы, но я не вижу в них никакого решения. Я хочу создать новый объект, если он не существует в базе данных, и обновить его, если он существует. Вот мой простой код:Обновление вызова в Parse Cloud Code

Parse.Cloud.beforeSave("Tag", function(request, response) { 
    var query = new Parse.Query("Tag"); 
    query.equalTo("name", request.object.get("name")); 
    query.first({ 
    success: function(result) { 
     if (!result) { 
      response.success(); 
     } else { 
      result.increment("popularityCount"); 
      result.save(); 
     } 
    }, 
    error: function(error) { 
     alert("Error: " + error.code + " " + error.message); 
    } 
    }); 
}); 

Как вы видите, я называю его BeforeSave. Если запрос ничего не находит, создается новая запись. Если запрос находит что-то, он должен принять этот результат и popularityCount. Но это не так. Он работает только в том случае, если после этого я вызываю response.success(), но вызов этой функции также вызывает создание новой записи.

+0

TypeOf результата === «неопределенный» вместо результата ..... попробовать что –

+0

спасибо, но эта часть работает нормально, проблема заключается в том, что results.save(); не работает, если я не буду вызывать response.success(), и если я его назову, новый объект также создается. –

ответ

1

Кажется неправильным увеличивать счетчик на объекте при каждом сохранении. Что делать, если объект изменен по другой причине? Если вы действительно хотите увеличивать поле на каждом сохранении, нет необходимости в запросе - объект, который будет сохранен, передается функции. Кроме того, запрос не будет работать в случае сохранения нового объекта.

Как насчет вместо этого найти или создать объект как одну операцию, увеличить счетчик, когда приложение логика требует его

function findOrCreateTagNamed(name) { 
    var query = new Parse.Query(Tag); 
    query.equalTo("name", name); 
    return query.first().then(function(tag) { 
     // if not found, create one... 
     if (!tag) { 
      tag = new Tag(); 
      tag.set("popularityCount", 0); 
      tag.set("name", name); 
     } 
     return (tag.isNew())? tag.save() : Parse.Promise.as(tag); 
    }); 
} 

function incrementPopularityOfTagNamed(name) { 
    return findOrCreateTagNamed(name).then(function(tag) { 
     tag.increment("popularityCount"); 
     return tag.save(); 
    }); 
} 

Теперь нет необходимости BeforeSave логики (что кажется правильным, что нужно сделать, не обходной путь). !

Parse.Cloud.beforeSave("Tag", function(request, response) { 
    var tag = request.object; 
    tag.increment("popularityCount"); 
    response.success(); 
}); 
+0

'response.success()' автоматически создает новую запись. Я пытаюсь сделать ваш код сейчас. –

+0

Я получил «Результат»: {«code»: 124, «message»: «Слишком много рекурсивных вызовов в Cloud Code»} 'в моих журналах из Parse. –

+0

ой, мой плохой. его сохранение до сохранения, поэтому мы хотим только сохранить новый случай. вы правы в отношении успеха ответа. см. править. – danh