beforeSave 不会修改 request.object

问题描述 投票:0回答:2

我正在尝试通过云代码为新用户添加一些附加属性:

Parse.Cloud.beforeSave(Parse.User, (request) => {
    if (!request.original) {
        // New user
        Parse.Config.get()
            .then((config) => {
                const ProfileIcon = Parse.Object.extend("ProfileIcon");
                const iconId = config.get("defaultProfileIcon");
                const user = request.object;
                // ...many user.set
                user.set("profileIcon", ProfileIcon.createWithoutData(iconId), {
                    useMasterKey: true,
                }); // Pointer
                // This will save as expected, but cause recursion
                // user.save({ useMasterKey: true });
            })
            .catch((err) => {
                console.error(err);
            });
    }
});

上面的代码触发并执行没有任何错误,但是当我检查数据库时,我的自定义属性没有显示出来。传递主密钥也没有任何作用。我该如何解决这个问题?
或者是因为来自客户端的请求(Android,无法访问主密钥),如果是这样,那么我如何为请求设置主密钥,因为

Parse.Cloud.useMasterKey()
已被弃用?

parse-platform parse-server parse-cloud-code
2个回答
1
投票

这里,在保存时修改对象没有提到任何关于

return
的内容,但是在保存文件之前提到了。所以我想尝试一下,结果证明它有效。但仍然不确定这是否是正确的方法。


0
投票

你的问题不是缺少返回,而是同步性问题。处理 Promise 时,一旦创建 Promise,线程就会解除阻塞,从而允许函数的其余部分(包括返回的代码)在解决等待触发器(此处为数据库请求)后跳转回完成 Promise 之前得到解决。

例如,您可以执行以下操作,并且效果很好:

Parse.Cloud.beforeSave(Parse.User, ({ object }) => {
 object.set('username', 'foo');
});

因为这是修改正在传递的对象(来自其他地方的保存命令的拦截器)。但是,在您的情况下,您正在执行异步的承诺请求,例如:

Parse.Cloud.beforeSave(Parse.User, async ({ object }) => {
  const config = await Parse.Config.get();
  user.set('username', config.get('defaultUsername'));
});

更多的是并行,当使用 async/await 时,承诺总是返回到决议中,因此基于承诺的上述等效项将是:

Parse.Cloud.beforeSave(Parse.User, ({ object }) => {
  return Parse.Config.get().then((config) => {
    user.set('username', config.get('defaultUsername'));
  });
});

beforeSave 钩子将等待返回的 Promise(需要时),您还可以在 Promise.then 内返回值以获取成功消息或抛出以获取错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.