【问题标题】:Find one user on moongose在 mongoose 上查找一位用户
【发布时间】:2021-12-31 15:23:07
【问题描述】:

我有以下问题要解决:我在一个数据库 (mongoDB) 中有多个用户。在特定的 url 中传递以下内容,例如:"my-page/users/here-goes-the-name-of-the-user"。 在 url 中显示用户名时,我将其转换为小写并用连字符替换空格:Husdady Mena ===> /husdady-mena。

在数据库中,用户名转换为小写前的用户名如:Husdady Mena、Donald Trump、Will Smith等

我需要以某种方式过滤一个用户,该用户在 url 中作为 /husdady-mena 与数据库用户:Husdady Mena,为了获取他的信息,如何在 mongoose 中完成该过滤?

一个清晰的js例子:

const users = [{ name: 'Husdady Mena' }, {name:'Donald Trump'}, {name:'Will Smith'}, {name:'Dubá Solis'}]

const username = "dubá-solis"
const url = `my-page.com/users/${username}`
const userToFilter = url.substring(url.lastIndexOf("/") + 1)

const userFound = users.find(({ name }) => {
  const usernameToLowerCase = name.toLowerCase().replace(/\s/gim, "-")
  return userToFilter === usernameToLowerCase
})

console.log(userFound)

如果你不清楚这个例子:我从前端向后端发出请求获取特定用户,我需要通过名称获取用户,不需要通过id获取。在 url 中类似于:my-page/users/dubá-solis 被绘制,我得到用户的名称,即:dubá-solis。在后端是这样的:

// Librarys
const { Router } = require('express')
const router = Router()

// Models
const User = require('@models/users/User')

router.get(
  '/users/:username',
  function(req, res) {
    try {
      // req.params.username === "dubá-solis"
      const userFound = await User.findOne({ name: req.params.username })
      // In database, the username is Dubá Solis, that's why it returns me null
      return res.status(200).json(userFound)
    } catch(err) {
      console.log('[UserFound.err]', err)
    }
  }
)

module.exports = router

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    为什么不直接转换用户名并将其传递给查询函数?比如:

    const convertUsername = username => {
      const nameParts = username.split('-');
      return nameParts.map(n => n.slice(0, 1).toUpperCase() + n.slice(1))
        .join(' ');
    };
    
    console.log(convertUsername('dubá-Solis'));
    console.log(convertUsername('joan-of-arc'));

    那么,就做User.findOne({ name: convertUsername(req.params.username) })

    【讨论】:

    • 有趣的答案我没有想过,虽然我必须澄清他们不会总是看到有2个名字的用户,有超过2个名字的用户,也许这很容易解决。让我担心的是用户名是动态的,它们可能是这样的:Adolf hittler、Joan of Arc、Agustin Laporte。在某些情况下不需要转换为大写,如果我错了,请纠正我
    • @Husdady 好点,我稍微修改了代码以使用超过 2 个名称。至于那些已经是大写的,你可以从例子中看到它不会影响结果。唯一的例外是,如果您希望 'of' 等名称的部分不大写,在这种情况下,您必须指定一个不会大写的单词列表,并在大写之前检查每个部分
    • 我正在考虑使用正则表达式,一个过滤器,它从空格中获取以下字母,例如:“我的名字是”,它会采用“n”,它不会转换因此,将其转换为大写,因此,我认为将要排除的单词列表的工作量减少,如果这确实不起作用,我会考虑另一个。
    猜你喜欢
    • 2020-11-27
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2019-03-06
    • 2016-02-20
    相关资源
    最近更新 更多