根据ID从DynamoDB检索项目

时间:2019-11-27 15:44:20

标签: javascript node.js dynamodb-queries

我使用mern堆栈创建了一个简单的Crud应用程序。我可以将一个项目保存到dynamodb,但无法通过id检索该项目。该应用程序使用一个简单的save/edit/delete项的前端。

app.js

app.use('/api/event', event);

event.js

router.get('/:id', (req, res) => {
  const id = req.params.id;

  const params = {
    TableName: EVENTS_TABLE,
    Key: {
      id
    }
  };

  dynamoDb.get(params, (error, result) => {
    if (error) {
      res.status(400).json({ error: 'Error retrieving Event' });
    }
    if (result.Item) {
      res.json(result.Item);
    } else {
      res.status(404).json({ error: `Event with id: ${id} not found` });
    }
  });
});

表模型

{
    "TableName": "events",
    "KeySchema": [
      {
        "AttributeName": "id",
        "KeyType": "HASH"
      }
    ],
    "AttributeDefinitions": [
      {
        "AttributeName": "id",
        "AttributeType": "S"
      }
    ],
    "ProvisionedThroughput": {
      "ReadCapacityUnits": 1,
      "WriteCapacityUnits": 1
    }
}

错误:

  

id未定义

我的代码: https://github.com/omarhassanhub/mern-event

角度代码:所有事件的链接

<tbody>
  {this.state.events.map(event =>
  <tr>
    <td>
      <Link to={`/show/${event._id}`}>{event.date} </Link> </td> <td>{event.time}</td>
    <td>{event.title}</td>
  </tr>
  )}
</tbody>

尝试通过ID获取event

  componentDidMount() {
    axios.get('/api/event/'+this.props.match.params.id)
      .then(res => {
        this.setState({ event: res.data });
        console.log(this.state.event);
      });
  }

2 个答案:

答案 0 :(得分:0)

您必须定义请求键的列名。更改您的params对象,带有列名的Key表达式并尝试。

const params = {
    TableName: EVENTS_TABLE,
    Key: {
      'id':id
    }
  };

答案 1 :(得分:0)

在这一行,您将列表与错误的数据绑定

<Link to={`/show/${event._id}`}>{event.date} </Link> </td> <td>{event.time}</td>

您的event包含id字段,而不是_id(您的表模型说的话)

然后,当您尝试在this.props.match.params.idaxios.get('/api/event/'+this.props.match.params.id))上获取事件ID时,id将是undefined

要解决此问题,只需使用正确的数据生成事件列表:

<Link to={`/show/${event.id}`}>{event.date} </Link> </td> <td>{event.time}</td>