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)
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)
您将 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 接口中定义的。