如何从云代码(解析服务器)创建和保存对象
How to create and save object from cloud code (parse server)
我需要在用户注册后创建一个云函数,它将在 path/class "publicUserInfo" 中创建一个对象,其 objectId 与具有给定字段的用户 ID 相同。我试图将一些已经回答的问题的代码放在一起,但我还没有看到一个简单的例子。
到目前为止我的代码:
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 中,与用户的相同,数据不存在因此不需要搜索,我必须创建它。有什么想法吗?
您不能设置 id,也不应该设置。相反,指向 public 用户信息所属的用户。
这是我的代码版本,带有单元测试以确保它按预期工作。请注意,我使用的是现代 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('Whosebug', 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();
});
});
我需要在用户注册后创建一个云函数,它将在 path/class "publicUserInfo" 中创建一个对象,其 objectId 与具有给定字段的用户 ID 相同。我试图将一些已经回答的问题的代码放在一起,但我还没有看到一个简单的例子。
到目前为止我的代码:
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 中,与用户的相同,数据不存在因此不需要搜索,我必须创建它。有什么想法吗?
您不能设置 id,也不应该设置。相反,指向 public 用户信息所属的用户。
这是我的代码版本,带有单元测试以确保它按预期工作。请注意,我使用的是现代 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('Whosebug', 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();
});
});