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

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

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

最佳答案

您可能错过了“返回”,并且保存是在您的 promise 兑现之前发生的。 我还发现您在嵌套作用域中使用相同的变量“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 和 wait 来扁平化您的代码,如下所示。通过使用平面代码,您可以消除大量导致错误的困惑

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

关于javascript - Parse.Cloud.beforeSave 无法在正在创建的对象上设置新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60680031/

相关文章:

javascript - 解析获取没有任何实际数据的对象

database - 解析服务器,MongoDB - 获取对象的 "liked"状态

java - W/System.err : com. parse.ParseRequest$ParseRequestException:i/o 失败

node.js - 检索音频 - 二进制文件 - 存储在我的 Mlab 中

ajax - 在 Django 中存储 api key 的位置

node.js - mongoDB 是否有重新连接问题或者我做错了?

javascript - 进行数据绑定(bind) :click work like a marker. addListener()

javascript - 检查复选框是否被选中?

javascript - Skype JavaScript 插件格式

javascript - jQuery 更新不起作用,但 javascript 可以