这个错误说明了啥?类型“ParsedQs”不可分配给类型“字符串”
Posted
技术标签:
【中文标题】这个错误说明了啥?类型“ParsedQs”不可分配给类型“字符串”【英文标题】:What does this error say? Type 'ParsedQs' is not assignable to type 'string'这个错误说明了什么?类型“ParsedQs”不可分配给类型“字符串” 【发布时间】:2020-12-14 04:55:30 【问题描述】:你好我的问题是我想使用猫鼬的搜索查询。但我想使用查询发出获取请求。为什么这是不可能的?我不明白这个错误。我正在使用 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)
)
我的错误信息:
(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)
【问题讨论】:
【参考方案1】:req.query
是一个包含请求查询的对象
所以如果你像/?foo=bar&a=123
这样向端点发送请求
您可以从
访问查询值req.query.foo // bar
req.query.a // 123
您正在将查询对象传递给$search
,同时您应该传递一个字符串,所以应该是
Company.find( $text: $search: req.query.yourQueryKey as string ).exec((err, docs) =>
【讨论】:
是的,但问题是即使我输入 req.query.foo 或类似的东西,我也会得到同样的错误。这个:No overload matches this call. The last overload gave the following error. Type 'string | ParsedQs | string[] | ParsedQs[] | undefined' is not assignable to type 'string'.
检查我的编辑。您需要使用 as
将类型转换为字符串【参考方案2】:
req.query
是一个对象,其中包含您在查询中指定的所有查询参数。
如果你的请求是这样的
test.com/search/?s=something
something
将存储在 req.query.s
中。
第二个选项是使用named route parameters。 所以你可以设置这样做:
请求网址
test.com/search/something
路线
app.get('/search/:search', (req, res) =>
console.log(req.params.search); // "something". NB use req.params, not req.query
)
【讨论】:
【参考方案3】:像下面这样添加 as any 可能会对您有所帮助 -
Company.find( $text: $search: req.query as any ).exec((err, docs) =>
-------------
-------------
-------------
【讨论】:
【参考方案4】:您正在将 req.query 传递给您的搜索,并且 req.query 的默认 Typescript 类型是
Request<unknown, unknown, unknown, QueryString.ParsedQs, Record<string, any>>.query: QueryString.ParsedQs
如果你传入 req.query.searchText 的类型将是
string | QueryString.ParsedQs | string[] | QueryString.ParsedQs[] | undefined
这里已经回答了简单的方法,只是做
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)
)
这可行,但当您的查询参数中有很多变量时会变得草率。快速试用您的端点的 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)
)
您可以看到使用 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>>
现在使用 RequestHandler。我可以输入参数、正文、reqbody 或查询。使用组合或使用未知的方式跳过它们,就像我在示例中所做的那样。
这还有一个额外的好处,那就是为您提供类型安全性
const test = req.query.test
会为我突出显示 vscode 中的打字错误,因为“测试”是在我的 QueryTypes 接口中定义的。
【讨论】:
以上是关于这个错误说明了啥?类型“ParsedQs”不可分配给类型“字符串”的主要内容,如果未能解决你的问题,请参考以下文章