【问题标题】:req.file is undefined when I use multer to upload post当我使用 multer 上传帖子时,req.file 未定义
【发布时间】:2021-09-30 19:12:58
【问题描述】:

我想将图片上传到 cloudinary 并将链接存储在我的 mongoDB 数据库中。我想使用 multer 上传文件,但由于某种原因,我在 post.js 中的 uploadPost 函数中未定义 req.file。 这是 user.js 路由文件,我在其中声明了路由 '/create-post'

const express = require('express');

const router = express.Router();

const {newpost,uploadPost}=require('../controllers/post')  
const { isAuth } = require('../middleware/auth');

const multer=require('multer');


const storage=multer.diskStorage({});


const fileFilter=(req,file,cb)=>{
    if(file.mimetype.startsWith('image')){
        cb(null,true);
    }else{
        cb('invalid image file!',false);
    }
}

const uploads=multer({storage,fileFilter})

router.post('/create-post',isAuth,newpost,uploads.single('post'),uploadPost);

module.exports = router;

请忽略 isAuth。它只是一个jsonwebtoken授权函数。

这是post.js。它有两个功能,newpost中间件和uploadPost

const PostModel=require('../models/Posts');
const jwt=require('jsonwebtoken');
const UserModel=require('../models/Users')
const cloudinary=require('../helper/imageUploader')
exports.newpost=async(req,res,next)=>{
   try {
   const token = req.headers.authorization.split(' ')[1];
   const decode = jwt.verify(token, process.env.JWT_SECRET);
   const user_id = await decode.userId;

   const Newuser=await UserModel.findById(user_id);
       if(!Newuser){
          return res.json({success:false,message:"No User found"});
       }

       let newpost=new PostModel({
         user_id:user_id,
        display_name:req.body.display_name,
         image:'' 
       });
    console.log(newpost);
    await newpost.save();
    req.newpost=newpost;   
    next();
   } catch (error) {
      res.json({success:false,message:"New post not created"})
   }
        
 };
exports.uploadPost=async(req,res)=>{
          const {newpost}=req;
          console.log(newpost);
          console.log(req.file);//This is coming undefined(Used postman to upload)
      }

这是控制台的输出:-

另外,我正确使用了邮递员,我确信那里没有错误。 还要添加一件事,当我不使用 newpost 中间件而不是使用 uploadPost 用于相同目的时,它确实返回 req.file 但现在我没有得到 newpost.save() 中的 em>display_name 不起作用。

exports.uploadPost=async(req,res)=>{
            try {
                const token = req.headers.authorization.split(' ')[1];
                const decode = jwt.verify(token, process.env.JWT_SECRET);
                const user_id = await decode.userId;
        
                const Newuser=await UserModel.findById(user_id);
                    if(!Newuser){
                        return res.json({success:false,message:"No User found"});
                    }
        
                    let newpost=new PostModel({
                      user_id:user_id,
                      display_name:req.body.display_name,
                      image:'' 
                    });
                    console.log(newpost);
                    console.log(req.file);
                    await newpost.save();   
                    req.newpost=newpost;
                } catch (error) {
                   res.json({success:false,message:"New post not created"})
                }
                const {newpost}=req;
                console.log(newpost);
}

这里是邮递员窗口:- 这是此案例的控制台输出:- 另外,这是模型架构:-

const mongoose=require('mongoose');
const Schema=mongoose.Schema;
const ObjectId=Schema.ObjectId;

const PostSchema=new Schema({
    user_id:{
        type:ObjectId,
        required:true
    },
    display_name:{
        type:String,
        required:true
    },
    image:{
        type:String
    },
    timestamp:{
        type:String,
        default:Date.now()
    }
});

const PostModel=mongoose.model('Post',PostSchema);

module.exports=PostModel;

请帮忙!我被困在这里。谢谢。

【问题讨论】:

  • 您确定以form-data 格式发送请求正文吗?
  • @Ikdemm 是的,我只发送表单数据中的图像。
  • 检查问题是否来自过滤器。我认为该文件没有通过过滤器。尝试评论/删除它,看看你会得到什么。
  • @Ikdemm 我尝试删除过滤器,但在第一种情况下它不起作用。我又添加了一个案例...请查看。
  • 您可以向我们发布您的模型架构吗?

标签: node.js express multer


【解决方案1】:

嗯,我的猜测是您将 user_id 保存为字符串,但您在架构中将其设置为 objectId

试试:

                let newpost=new PostModel({
                  user_id: mongoose.Types.ObjectId(user_id),
                  display_name:req.body.display_name,
                  image:'' 
                });

【讨论】:

  • 我试过了,但 console.log(newpost) 现在完全未定义:(
  • @RahulThakur 你到底想做什么
  • 首先,如果我使用 newpost 函数,那么 req.file 在 uploadPost 函数中是未定义的,如果我不使用 newpost 函数而是在 uploadPost 函数中创建 newpost,newpost.save() 不是在职的。我想要一个保存在数据库中的对象,其中包含 user_id、display_name(来自 req.body)和图像 url(来自 req.file)。
【解决方案2】:

无论如何,我通过创建单独的路由来创建新帖子和上传帖子解决了这个问题,但我仍然不知道为什么当我使用 newpost 作为中间件时 req.file 未定义。

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-04-14
    • 2020-11-01
    • 2021-10-02
    相关资源
    最近更新 更多