Parse.Cloud.beforeSave не может установить новое поле для создаваемого объекта - PullRequest
0 голосов
/ 14 марта 2020

У меня небольшая проблема с функцией Parse.Cloud.beforeSave на Parse-Server. Эта строка меня озадачивает:

request.object.set("dbCount", 0);

Она работала раньше. Но так как я сделал обновление сервера, чтобы быть в стеке heroku-18 , в соответствии с запросом HEROKU ( cedar-14 стек уходит в конце срока службы). Он больше не работает.

Цель этой строки - привязать счетчик, инициализированный к нулю, когда новый элемент сохраняется в базе данных. Но хотя элемент создан, как и должно быть, поле «dbCount» отсутствует. Это почему? И какой правильный код для создания поля?

Для справки, вот соответствующий код функции beforeSave:

Parse.Cloud.beforeSave("TheCollection", async (request) => {
 if (!request.object.isNew()) return;
 var query;
 query = new Parse.Query("TheCollection");
 query.equalTo("TITLE",request.object.get("TITLE"));

 await query.find().then
 (function(resUnit) {
  // If there is already a Unit with the same Title, we return an error.
  if (resUnit.length) throw "TITLE-USED";

  var query;
  query = new Parse.Query("TheCollection");
  var token = request.user.getSessionToken();
  query.find({sessionToken: token}).then
  (function(resUnit) {
    ... some useful processing ...
    // This next line is not working as it used to.
    request.object.set("dbCount", 0);
   });
  });
 });

1 Ответ

1 голос
/ 25 марта 2020

Возможно, вы пропускаете «возврат», и сохранение происходит до того, как ваше обещание разрешится. Я также вижу, что вы используете ту же переменную "resUnit" во вложенной области видимости, что может сбить ее с толку.

Parse.Cloud.beforeSave("TheCollection", async (request) => {
 if (!request.object.isNew()) return;
 var query;
 query = new Parse.Query("TheCollection");
 query.equalTo("TITLE",request.object.get("TITLE"));

 await query.find().then
 (function(resUnit) {
  // If there is already a Unit with the same Title, we return an error.
  if (resUnit.length) throw "TITLE-USED";

  var query;
  query = new Parse.Query("TheCollection");
  var token = request.user.getSessionToken();
  >>>> return <<<<< query.find({sessionToken: token}).then
  (function(resUnit) {
    ... some useful processing ...
    // This next line is not working as it used to.
    request.object.set("dbCount", 0);
   });
  });
 });

Если вы хотите go сделать шаг дальше, я бы в полной мере воспользовался asyn c и ждите, чтобы выровнять ваш код следующим образом. используя плоский код, вы можете устранить много беспорядка, который допускает ошибки

Parse.Cloud.beforeSave("TheCollection", async (request) => {
 if (!request.object.isNew()) return;
 const query = new Parse.Query("TheCollection");
 query.equalTo("TITLE",request.object.get("TITLE"));

 const resUnit1 = await query.first()
 // If there is already a Unit with the same Title, we return an error.
 if (resUnit) throw "TITLE-USED";

  const query2 = new Parse.Query("TheCollection");
  const resUnit2 = await query2.find({sessionToken: request.user.getSessionToken()})
  ... some useful processing ...
  request.object.set("dbCount", 0);
 });
...