Google 数据存储区合并创建了一个新的不需要的 属性
Google Datastore merge creates a new unwanted property
我目前正在尝试用 Typescript 编写 API 来存储和检索 Google Cloud Datastore 实例中的实体。
我已经设法使 GET
、POST
和 DELETE
正常工作,但是我的 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 调用中使用的方法是:
- 先通过参数获取实体
:id
- 将状态设置为
req.body.status
中指定的新状态
- 将原始实体与新创建的实体合并
然而,这会创建不需要的 属性,如屏幕截图所示
如图所示,一个名为 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(...)
来解决此问题。
我目前正在尝试用 Typescript 编写 API 来存储和检索 Google Cloud Datastore 实例中的实体。
我已经设法使 GET
、POST
和 DELETE
正常工作,但是我的 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 调用中使用的方法是:
- 先通过参数获取实体
:id
- 将状态设置为
req.body.status
中指定的新状态
- 将原始实体与新创建的实体合并
然而,这会创建不需要的 属性,如屏幕截图所示
如图所示,一个名为 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(...)
来解决此问题。