如果用户不使用 multer 选择文件,如何忽略表单数据中的 "req.file.path"

How to ignore "req.file.path" from form data if user do not choose a file using multer

你好,我正在使用 MERN Stack 开发一个社交网络项目,用户可以在其中制作仅包含文本的 post,也可以通过上传图片和一些图片来制作 post文本作为标题,但问题是当用户不希望上传图像而只想 post 仅包含文本并将 postImage 字段留空时,就会发生此错误 Cannot read property 'path' of undefined解决方案是什么,我附上了 post 架构、post 路由和 post 状态:

Post 架构:

const mongoose = require('mongoose');

const postSchema = mongoose.Schema({
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'Users',
  },
  text: {
    type: String,
    required: [true, 'post cannot be empty'],
  },
  postImage: {
    type: String,
  },
  name: {
    type: String,
  },
  avatar: {
    type: String,
  },
  likes: [
    {
      user: {
        type: mongoose.Schema.ObjectId,
        ref: 'User',
      },
    },
  ],
  comments: [
    {
      user: {
        type: mongoose.Schema.ObjectId,
        ref: 'User',
      },
      comment: {
        type: String,
        required: true,
      },
      name: {
        type: String,
      },
      avatar: {
        type: String,
      },
      date: {
        type: Date,
        default: Date.now,
      },
    },
  ],
  date: {
    type: Date,
    default: Date.now,
  },
});


module.exports = mongoose.model('Post', postSchema); 

Post 路线:

const express = require('express');
const router = express.Router();
const auth = require('../middleware/auth');
const Post = require('../models/postModel');
const multer = require('multer');
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploads');
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname);
  },
});

const fileFilter = (req, file, cb) => {
  if (
    file.mimetype === 'image/jpeg' ||
    file.mimetype === 'image/png' ||
    file.mimetype === 'image/gif'
  ) {
    cb(null, true);
  } else {
    cb(new Error('The supported file types are jpeg, png and gif'), false);
  }
};

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 * 5,
  },
  fileFilter: fileFilter,
});
const { check, validationResult } = require('express-validator');
const User = require('../models/userModel');

    router.post(
      '/',
      upload.single('postImage'),
      [auth, check('text', 'Text is required').not().isEmpty()],
      async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          return res.status(400).json({ errors: errors.array() });
        }
    
        try {
          const user = await User.findById(req.user.id).select('-password');
    
          const newPost = new Post({
            text: req.body.text,
            postImage: req.file.path,
            name: user.name,
            avatar: user.avatar,
            user: req.user.id,
          });
    
          const post = await newPost.save();
    
          res.json(post);
        } catch (err) {
          console.error(err.message);
          res.status(500).send('Server Error');
        }
      }
    );

Post 状态:

const createPost = async postData => {
    try {
      const config = {
        headers: {
          'Content-Type': 'multipart/form-data',
        },
      };
      const res = await axios.post('/api/posts', postData, config);
      dispatch({
        type: ADD_POST,
        payload: res.data,
      });
    } catch (err) {
      dispatch({
        type: POST_ERROR,
        payload: err.response.msg,
      });
    }
  };

您可以简单地检查是否定义了 req.file - 如果是,将 postImage 设置为其 path,否则将其设置为 undefined:

const newPost = new Post({
            text: req.body.text,
            postImage: req.file ? req.file.path : undefined,
            name: user.name,
            avatar: user.avatar,
            user: req.user.id,
          });