【问题标题】:Cloud Datastore and Node.js: Cannot get entityCloud Datastore 和 Node.js:无法获取实体
【发布时间】:2017-07-07 14:29:56
【问题描述】:

我正在使用带有 Node.js 的 App Engine 柔性环境,并尝试在 Cloud Datastore 中存储和检索实体。

以下代码成功新建Event实体:

/* Create event */
router.post('/', function(req, res, next) {    
  const eventKey = datastore.key('Event');
  datastore.save({
    key: eventKey,
    data: req.body
  })
  .then(() => {
    console.log('New event created');
    res.json({id: eventKey.id});
  })
  .catch((err) => { next(err); });
});

但是,当我提供之前返回的id 时,以下返回一个空数组:

/* Get an event */
router.get('/:id', function(req, res, next) {
  console.log(req.params.id);
  var eventKey = datastore.key(['Event', req.params.id]);
  datastore.get(eventKey)
  .then((event) => {
    console.log(event);
    res.json(event);
  })
  .catch((err) => { console.log(err); next(err); });
});

我似乎正确地使用了datastore.get,并且使用了what the docs is telling me to do。

知道为什么我无法获得我之前创建的实体吗?

【问题讨论】:

    标签: node.js express google-cloud-datastore google-cloud-platform


    【解决方案1】:

    值得注意的是,Cloud Datastore 键 ([Ancestor path +] kind + id/name) 对整数 (id) 和字符串 (name) 的处理方式不同。也就是说以下2个key指的是不同的实体:

    • 键(事件,1234)
    • 键(事件,“1234”)

    我不是节点专家,但它是否可能正在编写和读取这些不同的键?

    parseInt 可以解决这个问题:

    /* Get an event */
    router.get('/:id', function(req, res, next) {
      console.log(req.params.id);
      var eventId = parseInt(req.params.id, 10)
      var eventKey = datastore.key(['Event', eventId]);
      datastore.get(eventKey)
      .then((event) => {
        console.log(event);
        res.json(event);
      })
      .catch((err) => { console.log(err); next(err); });
    });
    

    【讨论】:

    • 就是这样:确保我传递了一个整数解决了它:var eventKey = datastore.key(['Event', parseInt(req.params.id, 10)]);
    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 2020-04-11
    • 2018-06-25
    • 2019-10-19
    • 1970-01-01
    • 2019-08-07
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多