【问题标题】:Express + Typescript: Req.status(200) - Type 'Number' has no call signaturesExpress + Typescript:Req.status(200) - 类型“号码”没有呼叫签名
【发布时间】:2026-02-17 08:45:02
【问题描述】:

我对 typescript 相当陌生,并试图让 Express-server 运行它。所以我基本上是想在用 axios 获取数据后让下面的代码运行:

import express, { Response, Request } from 'express'
(...)
app.get('/api/mk', async (req: express.Request, res: express.Response) => {
    await axios
        .get('http://localhost:8080/rest/kuk/v1/ownerMKKOL/getALL')
        .then((axiosResponse) => {
            const { data } = axiosResponse

            return res.status(200).send(data)
        })
        .catch((err) => err)
})

但是,我收到以下错误消息,并且无法理解它:

此表达式不可调用。 “号码”类型没有呼叫签名。 TS2349

我必须扩展Response-接口吗?如果是这样,可能的解决方案是什么样的?

非常感谢任何帮助!

解决方案:

我终于找到了基本上归结为我的项目结构问题的解决方案:

Root
|-- React App
    |-- Server
    |   |-- package.json
    |   `-- ...
    `-- package.json
        `-- ...

不知何故,当从我的React App 包运行构建命令时,会出现这个问题。我确实通过以下方式重组了我的项目,问题确实消失了:

Root
|-- Server
|   |-- package.json
|   |-- express.ts
|   `-- ...
`-- Client
    |-- package.json
    `-- ...

【问题讨论】:

  • 我更关心你在同一个承诺链中同时使用await.then,显然是没有理由的。另外,如果您要通过调用 express.Request 等来使用它的属性,为什么还要从 express 导入响应和请求
  • 顺便说一句,你可以跳过.status(200)(默认设置)。

标签: javascript node.js typescript express


【解决方案1】:

在您的代码中,您正在等待一个承诺结果,但您还为结果注册了一个回调函数,并为失败注册了一个回调。这也将返回一个承诺,因此代码是正确的,但您没有返回它的值,这会导致错误。

此外,将 .then().catch() 方式与 await 语法混合起来也不容易阅读。我会这样更改代码:

app.get('/api/mk', async (req: express.Request, res: express.Response) => {
    const axiosResponse = await axios
        .get('http://localhost:8080/rest/kuk/v1/ownerMKKOL/getALL');
    const { data } = axiosResponse;
    return res.status(200).send(data);
})

如果抛出异常,它会被自动触发并传递给 express: 并不一定要处理它,因为在您的起始代码中,您除了再次抛出它之外什么都不做。

【讨论】:

  • 感谢您的建议。所以我应用了你的代码,也接受了@Yevgen Gorbunkov 和@Krzysztof Krzeszewski 的建议,因为它导致了问题,并认为我可以阻止它,但现在我得到了:> 属性“发送”不存在在“响应”类型上。这真的让我很困惑,因为我在 package.json 中使用了@types/express
最近更新 更多