如何在Node.js / Express中过滤API响应

时间:2019-12-20 09:23:05

标签: node.js mongodb express mongoose

我正在尝试使用以下组件制作聊天应用程序(我在这里只写了所有内容,因为我不知道哪些信息很重要,对不起): Angular,Nodejs,Expressjs,MongoDB,Mongoose

localhost:3000/message模式中,[{content: "this is a message(text)", sender: "1337(number)", receiver:"42(number)"}]有多个数据库条目

现在,我只想在我的有角页面中显示当前用户(通过其mongo生成的ID)是接收方的发件人(因此基本上是允许他查看的消息)的条目。

我当然可以请求所有消息,然后在前端过滤它们,但是在我看来,这是一种不良做法,并且如果我想将页面置于在线状态,则是一个严重的安全问题,每个人都可以在找到api后请求所有消息。

我想到的另一种方法是路由到/message/:userID并存储他的消息。这可能与/message/:messageID冲突,您可以在其中放置/删除一次按摩。如果发生的话,这种可能性很小,但是却很成问题

我应该选择什么以及如何做?还是我还没有找到强大的工具/做法?

提前谢谢

2 个答案:

答案 0 :(得分:2)

您有三个选择。

  • 更改一个的路径,使其唯一。
  • 将它们组合到一个路由处理程序中,并设计出如何分辨哪一条逻辑 您想从其他条件下执行。
GET /message/:id?action=<the_action_you_have_to_do ex: delete/get_messages>
app.get('/message/:id', (req, res) => {
    req.query.action === 'delete'
    // perform delete functions
    req.query.action === 'get_messages'
    // retrive messages
})
  • 使用更复杂的路由定义,以便您实际告诉每个路由定义 两条路线之间的差异。
app.get('user/message/:id', (req, res) => {
    // perform delete functions
})
app.get('/message/:id', (req, res) => {
    // retrive messages
})

答案 1 :(得分:1)

我绝对会让猫鼬做一个查询以仅获取您需要的文档-让服务器执行此操作而不是在前端进行排序/过滤更加容易和安全。我假设您了解猫鼬查询,并且只关注端点问题。

使用清晰的API端点

当我使用Express和API端点时,我尝试使它们尽可能清晰。在您的示例中,我将实现以下路线。在这种情况下,我假设您正在使用JWT令牌来验证用户。

非特定于用户的消息

  • 从消息池中获取特定消息 app.get('/messages/:id')

  • 从消息池中获取所有消息 app.get('/messages')

特定于用户的消息

  • 从用户处获取特定消息 app.get('/user/messages/:id')
  • 获取来自用户的所有消息 app.get('/user/messages')

除此之外,如果您使用各种可用的HTTP请求类型,例如PUTDELETE,则可以获得更多转移。

更新/删除用户特定的消息

  • 删除用户的特定消息 app.delete('/user/messages/:id')
  • 更新来自用户的特定消息 app.put('/user/messages/:id')

我的类型取决于您如何验证用户身份,以及用户对象/信息在请求中的可用性。在请求正文中包含用户ID?使用passport和JWT令牌在中间件中检索用户对象?许多可能性。