繁体   English   中英

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

[英]Parse.Cloud.beforeSave not able to set a new field on an object being created

我在Parse-Server上的Parse.Cloud.beforeSave函数中有一个小问题。 这条线让我感到困惑:

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

它之前一直在工作。 但是由于我进行了服务器更新,按照HEROKU要求( cedar-14堆栈即将终止)位于heroku-18堆栈上。 它不再起作用。

此行的目的是在新项目存储在数据库中时粘贴一个初始化为零的计数器。 但是,尽管该项目已按原样创建,但缺少字段“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);
   });
  });
 });

您可能错过了“返回”,并且在您的承诺解决之前保存正在发生。 我还看到您在嵌套范围内使用相同的变量“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 和 await 像这样扁平化你的代码。 通过使用扁平化代码,您可以消除大量导致错误的混乱

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);
 });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM