Parse.Cloud.beforeSave无法在要创建的对象上设置新字段

问题描述 投票:0回答:1

我在Parse.Cloud.beforeSaveParse-Server功能上有一点问题。这条线让我感到困惑:

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

以前一直在工作。但是,由于我进行了服务器更新,因此应HEROKU的要求放在heroku-18堆栈上(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);
   });
  });
 });
javascript parse-server mlab heroku-api parse-cloud
1个回答
1
投票

很可能您错过了“回报”,并且在您的诺言得到解决之前就已经进行了保存。我还看到您在嵌套范围内使用了相同的变量“ 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);
   });
  });
 });

如果您想更进一步,我将充分利用async的优势,并等待扁平化您的代码。通过使用平面代码,您可以消除导致错误的许多混乱情况

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);
 });
© www.soinside.com 2019 - 2024. All rights reserved.