【问题标题】:Using multer diskStorage with Typescript将 multer diskStorage 与 Typescript 一起使用
【发布时间】:2021-11-01 22:44:09
【问题描述】:

我正在将 node.js 服务器翻译成打字稿。

我对节点的作用是:

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        const dir = './uploads/';
        mkdirp(dir, err => cb(err, dir));
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname)
    }
});

const upload = multer({
    storage: storage
});

router.post('/test', upload.fields({name: 'image'}), async function (req, res, next) {
...
});

但是我有很多错误。例如,我不能将文件参数设置为 Express.File 类型,'memoryStorage' 不接受参数或 mkdirp 告诉我这是不可调用的。

【问题讨论】:

    标签: node.js typescript server storage multer


    【解决方案1】:

    这是我使用 @types/multer 中的类型定义的方法。

    如果您还没有安装,请先安装 multer 包的类型定义:

    npm i --save-dev @types/multer
    

    导入和type 别名

    import { Request } from 'express'
    import multer, { FileFilterCallback } from 'multer'
    
    type DestinationCallback = (error: Error | null, destination: string) => void
    type FileNameCallback = (error: Error | null, filename: string) => void
    

    对于storage

    export const fileStorage = multer.diskStorage({
        destination: (
            request: Request,
            file: Express.Multer.File,
            callback: DestinationCallback
        ): void => {
            // ...Do your stuff here.
        },
    
        filename: (
            req: Request, 
            file: Express.Multer.File, 
            callback: FileNameCallback
        ): void => {
            // ...Do your stuff here.
        }
    })
    

    对于fileFilter

    export const fileFilter = (
        request: Request,
        file: Express.Multer.File,
        callback: FileFilterCallback
    ): void => {
        if (
            file.mimetype === 'image/png' ||
            file.mimetype === 'image/jpg' ||
            file.mimetype === 'image/jpeg'
        ) {
            callback(null, true)
        } else {
            callback(null, false)
        }
    }
    

    为了更简洁的代码和关注点分离,将上述两个常量放在一个单独的文件中,如config/multer.tsutil/multer.ts

    用法

    app.tsserver.ts中导入并使用上述常量:

    app.use(multer({ storage: fileStorage, fileFilter: fileFilter })
    

    【讨论】:

      【解决方案2】:

      我使用了下面的代码,它成功了

         const guidGenerator = require('uuid/v1');
      
         // configurates how the files are gonna be stored
         const storage = multer.diskStorage({
             destination: function (req: Express.Request, file: Express.Multer.File, callback: (error: Error | null, destination: string) => void) {
              callback(null, './upload/');
          },
          filename: function (req: Request, file: Express.Multer.File, callback: (error: Error | null, filename: string) => void) {
              const guid = guidGenerator();
              callback(null, guid + '_' + file.originalname);
          }
      });
      

      【讨论】:

        【解决方案3】:

        它有效,但我必须使用任何:S

        const storage = multer.diskStorage({
            destination: function (req: request, _file: any, cb: any) {
                const dir = './uploads/';
                mkdirp(dir, (err: NodeJS.ErrnoException) => {
                    cb(err, dir)
                });
            },
            filename: function (_req: request, file: any, cb: any) {
                cb(null, file.originalname)
            }
        });
        
        const upload = multer({
            storage: storage
        });
        

        【讨论】:

          【解决方案4】:

          就我而言,我使用了这个。

          const guidGenerator = require('uuid/v1');
          
          const storage = multer.diskStorage({
            destination: (req, file, callback) => {
              callback(null, path.resolve('./upload/'))
            },
            filename: (req, file, callback) => {
              const guid = guidGenerator();
              callback(null, `${guid}-${file.originalname}`);
            }
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-09-29
            • 2017-02-19
            • 2019-06-06
            • 2015-03-09
            • 2012-12-14
            • 2016-08-24
            • 2021-01-20
            • 2012-09-24
            相关资源
            最近更新 更多