【问题标题】:Parse.Cloud.beforeSave not able to set a new field on an object being createdParse.Cloud.beforeSave 无法在正在创建的对象上设置新字段
【发布时间】:2020-06-26 00:49:26
【问题描述】:

Parse-Server 上的 Parse.Cloud.beforeSave 函数有一点问题。这句话让我很困惑:

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

【问题讨论】:

  • 尝试将query.find({sessionToken: token}).then改为return query.find({sessionToken: token}).then
  • 我刚试过。你是对的。这解决了问题。

标签: javascript parse-server mlab heroku-api parse-cloud-code


【解决方案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 和 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);
 });

【讨论】:

  • 我在这里接受唯一(也是正确)的答案。但我认为在某种程度上应该归功于 Davi Macêdo,他在之前的评论中给出了相同的(简短)回复。感谢两者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2018-07-06
  • 2012-02-21
相关资源
最近更新 更多