Как создать и сохранить объект из облачного кода (сервер разбора) - PullRequest
0 голосов
/ 03 января 2019

Мне нужно создать облачную функцию после регистрации пользователя, которая создаст объект в пути / классе "publicUserInfo" с objectId, идентичным идентификатору пользователя с данными полями. Я попытался собрать код из уже отвеченных вопросов тут и там, но я не видел простого примера.

Пока мой код:

Parse.Cloud.afterSave(Parse.User, function(request) {
console.log("Custom log -> Parse.Cloud.afterSave(Parse.User, function(request){} :");

var id = request.object.id;
var date = new Date();

var userObject = Parse.Object.extend("publicUserInfo");
var userQuery = new Parse.Query(userObject);

userQuery.equalTo("objectId", id);

userQuery.first({
        useMasterKey: true, 
        success:function(userData){
            userData.set("nick", id);
            userData.set("nickch", date);
            userData.set("avatar", "1");
            userData.set("avatarch", date);
            userData.set("points", 0);
            userData.set("state", true);
            userData.set("lastSeen", date);
            userData.save(null, { useMasterKey: true });
        },
        error: function(error){
            console.log(error);
            response.error(error);
        }
    });

});

Я думаю, что код сначала ищет объект и, если он найден, вставляет данные. Я могу ошибаться, но мне нужно сохранить данные в publicUserInfo -> id так же, как и у пользователя, данных там нет, поэтому искать их не нужно, я должен их создать. Есть идеи?

1 Ответ

0 голосов
/ 08 января 2019

вы не можете установить идентификатор, и вам не нужно это делать. Вместо этого сделайте указатель на пользователя, которому принадлежит общедоступная информация пользователя.

Вот моя версия кода с модульным тестом, чтобы убедиться, что он работает как положено. Обратите внимание, что я использую современный JavaScript. Вы должны использовать либо узел 8, либо 10, мой код будет работать с этим.

const makePublicUser = function makePublicUser(request) {
  // use destructuring to get request objects
  const { object: user, log } = request;
  log.info('Custom log -> Parse.Cloud.afterSave(Parse.User, function(request){} :');
  const date = new Date();
  const userQuery = new Parse.Query('publicUserInfo');
  userQuery.equalTo('user', user);

  // could use async/await, but will do with promises
  return userQuery.first({ useMasterKey: true }) // shouldn't need the master here
    .then((result) => {
      const userData = result || new Parse.Object('publicUserInfo', { user });
      userData.set('nick', id);
      userData.set('nickch', date);
      userData.set('avatar', '1');
      userData.set('avatarch', date);
      userData.set('points', 0);
      userData.set('state', true);
      userData.set('lastSeen', date);
      return userData.save(null, { useMasterKey: true });
    })
    .catch(log.error.bind(log));
};

describe('StackOverflow', function () {
  beforeAll(function () {
    Parse.Cloud.afterSave(Parse.User, makePublicUser);
  });

  it('should create a publicUserInfo', async function () {
    const user = new Parse.User({ username: 'foo', password: 'bar' });
    await user.save();
    const publicUserInfo = await new Parse.Query('publicUserInfo')
      .equalTo('user', user)
      .first();
    expect(publicUserInfo).not.toBeNull();
  });
});
...