req.file 使用 multer 上传时未定义 post
req.file is undefined when I use multer to upload post
我想将图片上传到 cloudinary 并将 link 存储在我的 mongoDB 数据库中。我想使用 multer 上传文件,但由于某种原因,我在 uploadPost 函数中得到 req.file 未定义 post.js。
这是 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)
}
这是控制台的输出:-
此外,我正确地使用了 postman,而且我确信那里没有错误。
还有一件事要补充,当我不使用 newpost 中间件而不是使用 uploadPost 用于相同目的时,它确实return req.file 但现在我没有从 req.body 和 newpost.save() 得到 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);
}
这是post人window:-
这是此案例的控制台输出:-
另外,这是模型架构:-
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;
请帮忙!我被困在这里。谢谢。
嗯,我的猜测是您将 user_id
保存为字符串,但在架构中将其设置为 objectId
尝试:
let newpost=new PostModel({
user_id: mongoose.Types.ObjectId(user_id),
display_name:req.body.display_name,
image:''
});
无论如何,我通过创建单独的路由来创建新的 post 和上传 post 解决了这个问题,但我仍然不知道为什么 req.file 在我使用 new[ 时未定义=13=]作为中间件。
我想将图片上传到 cloudinary 并将 link 存储在我的 mongoDB 数据库中。我想使用 multer 上传文件,但由于某种原因,我在 uploadPost 函数中得到 req.file 未定义 post.js。 这是 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)
}
这是控制台的输出:-
此外,我正确地使用了 postman,而且我确信那里没有错误。 还有一件事要补充,当我不使用 newpost 中间件而不是使用 uploadPost 用于相同目的时,它确实return req.file 但现在我没有从 req.body 和 newpost.save() 得到 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);
}
这是post人window:-
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;
请帮忙!我被困在这里。谢谢。
嗯,我的猜测是您将 user_id
保存为字符串,但在架构中将其设置为 objectId
尝试:
let newpost=new PostModel({
user_id: mongoose.Types.ObjectId(user_id),
display_name:req.body.display_name,
image:''
});
无论如何,我通过创建单独的路由来创建新的 post 和上传 post 解决了这个问题,但我仍然不知道为什么 req.file 在我使用 new[ 时未定义=13=]作为中间件。