NodeJS 使用打印脚本进行复用和表示

nwwlzxa7  于 2023-02-18  发布在  Node.js
关注(0)|答案(3)|浏览(120)

背景

我正在做一个简单的网站,用户可以上传图片。我使用Node/React/Multer/Typescript

问题

app.post('/admin/uploads', async (req, res) => {
  uploadHandler(req, res, (err) => {
    ...
    if ( req.files.companyImage !== undefined ) {
      ...
    }
    res.sendStatus(201);
  });
});

typescript intellisense显示如下错误。

Property 'companyImage' does not exist on type '{ [fieldname: string]: File[]; } | File[]'.
Property 'companyImage' does not exist on type '{ [fieldname: string]: File[]; }'.ts(2339)

但是,我不明白为什么这是错误的。我认为files对象有类型{ [fieldname: string]: File[]; }。这意味着files对象可以有字符串属性。
所以我用简单的例子来测试。

type myType = {
  [fieldName: string]: number
}

let req: myType = {
  a: 333,
  b: 344
}

console.log(req.a);
console.log(req.c); // undefined but intellisense don't show error

我不知道为什么files对象不能有companyImage属性。
请结帐.

rsl1atfo

rsl1atfo1#

我不知道您是否成功地解决了您的问题,但我遇到了相同的问题,必须显式地告诉TypeScript我的req.files属性的类型,如下所示:

const files = req.files as { [fieldname: string]: Express.Multer.File[] };

注意,因为我使用的是upload.fields(...),所以我没有指定req.files也可以是简单的Express.Multer.File[]

nom7f22z

nom7f22z2#

由于您使用的是typescript,因此请为文件创建一个接口

interface IFile {
  fieldname: string;
  originalname: string;
  encoding: string;
  mimetype: string;
  buffer: Buffer;
  size: number;
}

然后声明const files = req.files as IFile[],并记住将files: IFile;添加到types/express/index.d.ts中,如下所示

declare global {
  namespace Express {
    interface Request {
      files: IFile;
    }
  }
}
q9yhzks0

q9yhzks03#

我用Object.assign(req.files)解出了它,然后你可以把它当作一个对象来处理:console.log(s.image[0].path);

相关问题