【问题标题】:Best practice for validating input in Express/Mongoose app (controllers and models)在 Express/Mongoose 应用程序(控制器和模型)中验证输入的最佳实践
【发布时间】:2021-07-02 17:30:47
【问题描述】:

我是 node/express/mongoose 和一般后端的新手,我正在从头开始构建 API。

我将代码拆分为控制器和 DAO(猫鼬模型),但我不确定应该在哪里进行验证,控制器和模型究竟应该做什么?

例如,对于路由 GET /users/:id,我希望它:

  • 如果给定的 id 不是有效的 ObjectId,则返回 400
  • 如果 id 是有效的 ObjectId,但不存在具有此 id 的文档,则返回 404
  • 如果找到文档,则返回 200,并在发送响应之前删除一些字段(密码、__v 和 _id(因为我创建了一个没有下划线的虚拟字段“id”))
  • 否则返回 500

这是我尝试过的。它目前正在做我想做的一切,但我不确定它是否是最好的实现:

users.controller.js

const UserModel = require('../models/users.model')
const mongoose = require('mongoose')

exports.getById = async (req, res) => {
    // Check that the id is a valid ObjectId
    if (!mongoose.Types.ObjectId.isValid(req.params.id)) {
        return res.status(400).json({ error: 'Invalid ObjectID' })
    }

    try {
        const user = await UserModel.findById(req.params.id)

        if (!user) return res.status(404).json({ error: 'No user with this ID' })

        res.status(200).send(user)
    } catch (err) {
        res.status(500).send(err)
    }
}

users.model.js

exports.findById = async (id) => {
    let user = await User.findById(id)

    if (!user) {
        return null
    }

    user = user.toJSON()
    delete user._id
    delete user.__v
    delete user.password
    return user
}

这是构建事物的最佳方式吗?请批评并提出任何改进和最佳做法。

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    我更喜欢在单独的小 js 文件中的 Controllers 文件和 helpers 类中执行所有验证和逻辑。 还试图使模型尽可能精简。实际上,您可以创建不同的中间件函数来验证某些输入。 创建 ErrorResponse 中间件也很有帮助,因此您可以执行以下简单易读的验证:

    if (!userFromDB) throw new ErrorResponse({code: 404, msg: "User doesn't exist"})
    

    而不是用不同的答案选项捕获它并在单独的文件中处理。

    后端有 100 多种实现方式。你需要选择你自己的?

    【讨论】:

    • 我主要关心的是模型,正如你所说,我希望它尽可能保持精简。因此,我将那些“删除”行移至控制器并删除了该 if 语句,这将模型的 findById 函数简化为简单地获取并返回用户(如果没有具有该 ID 的用户,则不返回任何内容)。
    • 对了,也可以考虑通过投影来移除字段,不要在控制器中显式移除
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多