未应用 Multer 目标配置

问题描述 投票:0回答:1

我正在尝试在我的网络应用程序中启用个人资料图片功能。为此,我使用 Express (4.19.2) 作为服务器,使用 Multer (1.4.5-lts.1) 进行多部分请求和文件处理,但是,Multer 目标代码似乎被忽略。我遵循了一些示例并获得了以下 Multer 中间件代码:

// Required modules
const fs = require('fs');
const path = require('path');
const multer = require('multer');

const validPictureExtensions = ['jpg', 'jpeg', 'png'];

// Profile picture configuration
const pictureStorage = multer.diskStorage({
    destination: (req, file, cb) => {
        // First check if resources directory exists
        if (!fs.existsSync(path.join(__dirname, '..', '..', 'resources'))) {
            console.info('Resources directory created.');
            fs.mkdirSync(path.join(__dirname, '..', '..', 'resources'));
        }
        
        // Then check if users directory exists
        if (!fs.existsSync(path.join(__dirname, '..', '..', 'resources', 'users'))) {
            console.info('Users directory created.');
            fs.mkdirSync(path.join(__dirname, '..', '..', 'resources', 'users'));
        }

        cb(null, 'users');
    },
    filename: (req, file, cb) => {
        const ext = file.originalname.split('.').pop();
        const name = `${req.user.id}.${ext}`;
        cb(null, name);
    }
});

const pictureFileFilter = (req, file, cb) => {
    const ext = file.originalname.split('.').pop();
    const isValid = validPictureExtensions.includes(ext);
    cb(null, isValid);
};

module.exports = {
    pictureMdw: multer({ pictureStorage, pictureFileFilter }),
}

然后,我在 /users 路径中使用之前的中间件,如下所示:

// Router
const router = require('express').Router();

// Middleware
const { pictureMdw } = require('./../middlewares/fileUpload');

// PUT
router.put('/:tagOrID/picture', pictureMdw.single('file'), userCont.updateUserPicture);

module.exports = router;

Multer中间件执行后相关控制器代码如下

await sharp(req.file.buffer)
                .resize({ width: 500, height: 500 })
                .jpeg()
                .toFile(path.join(__dirname, '..', '..', 'resources', 'users', `${tag}.jpeg`));

            res.sendStatus(200);

仅当之前使用类似

mkdir -p resources/users
之类的内容创建了必要的目录时,一切才能正常工作,否则,我会收到错误。我还没有运行调试器,但在中间件配置中调用时甚至没有打印
console.log('Here')
。 这里可能发生什么?我应该检查控制器中是否存在目录吗?我应该选择完全不同的方法吗?

javascript node.js express multer
1个回答
0
投票

问题在于传递给导出的 Multer 实例的错误配置。

module.exports = {
    pictureMdw: multer({ storage: pictureStorage, fileFilter: pictureFileFilter }),
}

感谢Prerak Sola指出了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.