Parse.Cloud.beforeSave не может установить новое поле для создаваемого объекта
У меня небольшая проблема в Parse.Cloud.beforeSave
функционировать на Parse-Server
. Эта строчка меня озадачивает:
request.object.set("dbCount", 0);
Он работал раньше. Но так как я сделал обновление сервера, чтобы он был в стеке heroku-18, по запросуHEROKU
(стеккедра-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 ответ
Возможно, вам не хватает "возврата", и сохранение происходит до того, как ваше обещание будет выполнено. Я также вижу, что вы используете ту же переменную 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);
});
});
});
Если вы хотите сделать еще один шаг, я бы в полной мере воспользовался асинхронным режимом и дождался, чтобы так выровнять ваш код. используя плоский код, вы можете устранить много беспорядка, который допускает ошибки
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);
});