这个错误说明了什么?类型 'ParsedQs' 不可分配给类型 'string'

red*_*lms 3 javascript mongoose mongodb express typescript

您好,我的问题是我想使用 mongoose 的搜索查询。但我想使用查询发出获取请求。为什么这是不可能的?我不明白这个错误。我正在使用 5.10.0 版的猫鼬。我不想将其作为发布请求进行,也不想使用 req.body。谁能帮我?

这是我的代码:

export const searching = (req: Request, res: Response) => {
  Company.find({ $text: { $search: req.query } }).exec((err, docs) => {
    if (docs) {
      res.status(200).json(docs)
    } else {
      console.log(err)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

我的错误信息:

(property) $search: string
No overload matches this call.
The last overload gave the following error.
Type 'ParsedQs' is not assignable to type 'string'.ts(2769)
Run Code Online (Sandbox Code Playgroud)

Owl*_*Owl 6

req.query 是一个包含请求查询的对象

因此,如果您像这样向端点发送请求 /?foo=bar&a=123

您可以从

req.query.foo // bar
req.query.a // 123
Run Code Online (Sandbox Code Playgroud)

您将查询对象传递给$search,同时您应该传递一个字符串,所以它应该是

Company.find({ $text: { $search: req.query.yourQueryKey as string } }).exec((err, docs) => {
Run Code Online (Sandbox Code Playgroud)

  • 检查我的编辑。您需要使用“as”将类型转换为字符串 (3认同)

Ric*_*ato 5

您将 req.query 传递到搜索中,req.query 的默认 Typescript 类型是

Request<unknown, unknown, unknown, QueryString.ParsedQs, Record<string, any>>.query: QueryString.ParsedQs 
Run Code Online (Sandbox Code Playgroud)

如果您传入 req.query.searchText ,其类型将为

string | QueryString.ParsedQs | string[] | QueryString.ParsedQs[] | undefined
Run Code Online (Sandbox Code Playgroud)

简单的方法已经在这里得到解答,只需执行即可

export const searching = (req: Request, res: Response) => { 
const searchText = req.query. searchText as string
  Company.find({ $text: { $search: searchText } }).exec((err, docs) => {
    if (docs) {
      res.status(200).json(docs)
    } else {
      console.log(err)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

这可行,但当查询参数中有很多变量时,就会变得很草率。在 Express 中,尝试为您的端点使用 RequestHandler。

import { RequestHandler } from 'express'

interface QueryTypes {
  searchText: string
  moreSearchText: string
}
export const searching:RequestHandler<unknown, unknown, unknown, QueryTypes > = (req, res) => {
  Company.find({ $text: { $search: req.query } }).exec((err, docs) => {
    if (docs) {
      res.status(200).json(docs)
    } else {
      console.log(err)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

您可以看到,使用 RequestHandler 我可以传入一些未知类型,第四个类型可以传入查询类型。我还可以将 Request 和 Response 类型删除为 (req, res),因为 RequestHandler 已经为我们键入了处理程序。

您可能想知道前面的 3 个未知是什么以及 RequestHandler 的 typescript 文档中的内容。这是文档。

interface RequestHandler<P = core.ParamsDictionary, ResBody = any, ReqBody = any, ReqQuery = qs.ParsedQs, Locals extends Record<string, any> = Record<string, any>>
Run Code Online (Sandbox Code Playgroud)

现在使用RequestHandler。我可以输入参数、正文、reqbody 或查询。使用组合或使用未知跳过它们,就像我在示例中所做的那样。

这还有一个额外的好处,就是为您提供类型安全,因此

const test = req.query.test
Run Code Online (Sandbox Code Playgroud)

会在 vscode 中突出显示打字稿错误,因为“test”是在我的 QueryTypes 接口中定义的。