我正在尝试使用以下组件制作聊天应用程序(我在这里只写了所有内容,因为我不知道哪些信息很重要,对不起): 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
冲突,您可以在其中放置/删除一次按摩。如果发生的话,这种可能性很小,但是却很成问题
我应该选择什么以及如何做?还是我还没有找到强大的工具/做法?
提前谢谢
答案 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)
我绝对会让猫鼬做一个查询以仅获取您需要的文档-让服务器执行此操作而不是在前端进行排序/过滤更加容易和安全。我假设您了解猫鼬查询,并且只关注端点问题。
当我使用Express和API端点时,我尝试使它们尽可能清晰。在您的示例中,我将实现以下路线。在这种情况下,我假设您正在使用JWT令牌来验证用户。
从消息池中获取特定消息
app.get('/messages/:id')
从消息池中获取所有消息
app.get('/messages')
app.get('/user/messages/:id')
app.get('/user/messages')
除此之外,如果您使用各种可用的HTTP请求类型,例如PUT
和DELETE
,则可以获得更多转移。
app.delete('/user/messages/:id')
app.put('/user/messages/:id')
我的类型取决于您如何验证用户身份,以及用户对象/信息在请求中的可用性。在请求正文中包含用户ID?使用passport
和JWT令牌在中间件中检索用户对象?许多可能性。