Google 数据存储区合并创建了一个新的不需要的 属性

Google Datastore merge creates a new unwanted property

我目前正在尝试用 Typescript 编写 API 来存储和检索 Google Cloud Datastore 实例中的实体。

我已经设法使 GETPOSTDELETE 正常工作,但是我的 PUT API 调用有效但创建了不需要的 属性 在使用 Postman 测试 API 调用之后。

这是路由到 /api/offer/:id

PUT API 调用的代码
export async function updateOffer(req: any, res: any) {
    try {
        const offerKey = datastore.key(["offer", datastore.int(req.params.id)]);
       
        var offer = await datastore.get(offerKey);
        
        if (req.body.status == null || req.body.status == undefined) {
            res.status(StatusCodes.BAD_REQUEST).send({
                message: "Offer could not be updated as `status` property was left empty",
                IsSuccess: false,
            });

            logger.error("Offer could not be updated as `status` property was left empty");   
        } else {
            offer.status = req.body.status;

            await datastore.merge({
                key: offerKey,
                data: offer
            });
    
            res.status(StatusCodes.OK).send({
                message: "Offer has been updated",
                IsSuccess: true,
                data: offer
            });
    
            logger.info("Offer has been updated");
        }

    } catch (e) {
        res.status(StatusCodes.BAD_REQUEST).send({
            message: "Unable to update offer",
            IsSuccess: false,
            error: JSON.stringify(e)
        });

        logger.error("Unable to update offer: " + e);
    }
}

代码的作用是,它只允许更新一个 属性 的要约实体,称为 status。因此,我在此 API 调用中使用的方法是:

  1. 先通过参数获取实体:id
  2. 将状态设置为req.body.status
  3. 中指定的新状态
  4. 将原始实体与新创建的实体合并

然而,这会创建不需要的 属性,如屏幕截图所示

如图所示,一个名为 0 的额外 属性 被添加到实体中,该实体由实体的 JSON 表示组成。我不确定为什么会这样,也不知道这是否是正确的方法。

datastore.get() returns 一个数组,所以当你将offer作为merge的数据参数传递时,它是一个数组而不是一个实体。因此,您要查找的实体数据位于数组的位置 0,这就是为什么您得到一个名为“0”的 属性。

您可以按照 https://cloud.google.com/datastore/docs/concepts/entities#retrieving_an_entity 中的建议将 get 调用更改为 const [offer] = datastore.get(...) 来解决此问题。