使用打字稿时表示缺少的属性:rawBody

时间:2018-06-24 21:05:01

标签: typescript express

编译时出现此控制台错误:

Property 'rawBody' does not exist on type 'Request'.

在这行代码上:

busboy.end(req.rawBody);

这些docs状态应该在那里。但是,当我改用打字稿时,我得到了一个错误。

当我提供该功能时,代码仍在本地运行,但是我想知道发生了什么,为什么以及如何清除类型错误。好像我无视他们,为什么要使用TS,我应该回到简单的js。

4 个答案:

答案 0 :(得分:1)

我正在将 Firebase Cloud Function 与 Typescript 结合使用,这也会引发此错误。

我的临时解决方法是使用 as 关键字告诉编译器在访问 req 时将 rawBody 对象视为另一种类型。

示例

import { Request, Response } from "express-serve-static-core"
import { https } from "firebase-functions";

type FirebaseRequest = https.Request

// The parameters still use the default types from express, 
// but consider it as another type when accessing rawBody
const myFunc = async (req: Request, res: Response) => {
  const rawVar = (req as FirebaseRequest).rawBody;
}

答案 1 :(得分:0)

您未提供有关代码的任何信息。 确保您安装并需要body-parser。

const bodyParser = require('body-parser')

答案 2 :(得分:0)

在我调用的代码之后:

busboy.on("finish"), () => {
  <code in here>
});

我最终使用了这个而不是busboy.end(req.rawBody);

req.pipe(busboy);

现在工作正常!

答案 3 :(得分:0)

现在遇到此问题。 Typescript声明它不应该在那儿,但它确实在那儿。您可以像这样将内容添加到Express.Request的打字稿定义中(与multer一样)

import { Request, ParamsDictionary, NextFunction, Response } from "express-serve-static-core";
interface BusboyFile {
    fieldname: string
    file: NodeJS.ReadableStream | undefined
    filename: string;
    destination: string;
    encoding?: string,
    mimetype?: string
}
declare global {
    namespace Express {
        interface Request {
            files: {
                [fieldname: string]: BusboyFile[];
            };
            rawBody: any
        }
    }
}

type uploadBusboy = (request: ExpressRequest<ParamsDictionary>, response: Response, next: NextFunction)=>void

然后我的功能:

export const uploadBusboy: uploadBusboy = (request, response, next) => {
    const busboy = new Busboy({ headers: request.headers });
    // ...code here
    busboy.end(request.rawBody);
}
export default uploadBusboy