【问题标题】:CRUD in Typescript with mongoose - query param checking使用 mongoose 在 Typescript 中进行 CRUD - 查询参数检查
【发布时间】:2022-11-23 05:42:13
【问题描述】:

我只想在插入之前检查控制器上的所有 req.query 就像我的 IGroupDocument 之后,才将文档添加到我的数据库集合中。

这方面的最佳做法是什么?

IGroup文档:

import { Document, Model } from "mongoose";

export interface IGroup {

    firstName: string;
    lastName: string;
    age?: number;
    email: string,
    dateOfEntry?: Date;
}

export interface IGroupDocument extends IGroup, Document {}

控制器:

function create(req: Request, res: Response) {
// req.query validation: if firstName, lastName and email exist and type string, and then make a document from req.query call newGroup.
    GroupModel.create(newGroup)
    res.send(`${req.query.name} created`)
}

【问题讨论】:

  • 您至少应该为我们提供一些代码示例,以了解您目前正在努力解决的问题。你使用的是带有 mongoose 库的普通 javascript 吗?您要在控制器级别还是模式级别进行验证?
  • 对不起,我已经解决了这个问题。现在更清楚了
  • 好吧,不。您甚至没有包含要将任何内容存储到数据库的代码。您也没有包含与IGroupDocument 相关的任何代码。您甚至根本没有包括应该检查的内容。是否应该检查某些查询参数是否为字符串、是否具有一定长度等?
  • 感谢您的关注!现在更清楚了吗?

标签: typescript mongoose crud


【解决方案1】:

您可以从请求对象中读取查询参数,如下所示:

const { firstName, lastName, email } = req.query;

然后,您可以将这些查询参数传递给您的文档创建函数,例如:

GroupModel.create({firstName, lastName, email});

验证应该参与您的猫鼬模式。由于您没有包含它,我自己创建了一个示例模式:

  const groupSchema = new Schema({
    firstName: { type: String, required: true },
    lastName: { type: String, required: true},
    email: { type: String, required: true }
  })

笔记:

  • 传递用于在查询参数中创建对象的值绝对是一种不好的做法。您应该在 POST 请求中将它们作为请求主体传递。
  • 不能在调用create函数后直接调用res.send('${req.query.name} created')。这将返回一个应等待的承诺。您可以只使用await GroupModel.create(...) 并将函数定义为async
  • 您在响应中包含了req.query.name,这是一个以前从未使用过的查询参数。您可能应该使用来自 awaited 承诺值的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2017-12-14
    • 2017-01-19
    • 2018-09-28
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多