Multer - 无法读取未定义的 属性 'buffer'
Multer - Cannot read property 'buffer' of undefined
我在将图像文件上传到我的服务器时遇到问题,我在 YouTube 上观看了一些关于 multer 的教程,我做了与教程中完全相同的事情,但出于某种原因,我收到了一个错误:("无法读取 属性 'buffer' of undefined"), req.file 也是未定义的。
我用谷歌搜索了这个错误,发现有些人有同样的问题,我试着像他们一样解决它,但它对我不起作用。
组件数据应用程序
newPostByUser(token, formData) {
return (async () =>
await call(`${this.url}/lost`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "multipart/form-data",
},
body: formData,
timeout: this.timeout,
}))();
},
组件图像解析
const path = require("path");
const multer = require("multer");
const storage = multer.memoryStorage();
const limits = { fileSize: 2000000 };
const upload = multer({
storage,
limits,
fileFilter(req, file, cb) {
var filetypes = /jpeg|jpg|png|gif/;
const mimetype = filetypes.test(file.mimetype);
const extname = filetypes.test(
path.extname(file.originalname).toLocaleLowerCase()
);
if (mimetype && extname) {
return cb(null, true);
}
cb(
"Error: File upload only supports the following filetypes - " + filetypes
);
},
}).single("image");
function imageParse(req, res, next) {
upload(req, res, function (err) {
if (err) {
return res.status(422).json({ error: err.message });
}
next();
});
}
module.exports = imageParse;
组件路线
require("dotenv").config();
const express = require("express");
const logic = require("../logic");
const auth = require("./auth");
const imageParse = require("../utils/imageParse");
const literals = require("../i18n/literals");
const router = express.Router();
const { research_newPost_messageConfirm } = literals;
router.post("/lost", auth, imageParse, (req, res) => {
console.log(req.buffer);
const {
file: { buffer },
body: { userId, category, name, age, city, description, lang },
} = req;
(async () => {
try {
const user = await logic.newResearch(
buffer,
userId,
category,
name,
age,
city,
description,
lang
);
res.status(201).json({ message: research_newPost_messageConfirm[lang] });
} catch ({ message }) {
res.status(400).json({ error: message });
}
})();
});
module.exports = router;
组件逻辑api
const streamifier = require("streamifier");
const cloudinary = require("cloudinary").v2;
const { Research } = require("../models");
const {
CLOUDINARY_API_KEY,
CLOUDINARY_SECRET_KEY,
CLOUDINARY_NAME,
} = require("../utils/config");
const { logic_newPost_messageError} = require("../i18n/literals");
const logic = {
newResearch(buffer, userId, category, name, age, city, description, lang) {
try {
return (async () => {
cloudinary.config({
cloud_name: CLOUDINARY_NAME,
api_key: CLOUDINARY_API_KEY,
api_secret: CLOUDINARY_SECRET_KEY,
});
const image = await new Promise((resolve, reject) => {
const uploadStream = cloudinary.uploader.upload_stream(
(err, image) => {
if (err) throw new LogicError("Image could not be uploaded");
resolve(image);
}
);
streamifier.createReadStream(buffer).pipe(uploadStream);
});
const newPost = await Research.create({
owner: userId,
category,
name,
age,
city,
description,
image: image.secure_url,
});
if (!newPost) throw new Error(`${logic_newPost_messageError[lang]}`);
console.log("api", newPost);
return newPost;
})();
} catch (error) {
console.log(error);
}
},
};
module.exports = logic;
不是req.buffer
是req.file.buffer
您需要使用 memoryStorage,它允许您将文件作为 Buffer 对象存储在内存中。
制作类似的东西:
import multer, { memoryStorage } from 'multer';
const upload = multer({
storage: memoryStorage(),
dest: './tmp'
});
categoriesRoutes.post(
'/import',
upload.single('file'),
(req, res) => {
console.log(req.file.buffer)
}
);
我在将图像文件上传到我的服务器时遇到问题,我在 YouTube 上观看了一些关于 multer 的教程,我做了与教程中完全相同的事情,但出于某种原因,我收到了一个错误:("无法读取 属性 'buffer' of undefined"), req.file 也是未定义的。 我用谷歌搜索了这个错误,发现有些人有同样的问题,我试着像他们一样解决它,但它对我不起作用。
组件数据应用程序
newPostByUser(token, formData) {
return (async () =>
await call(`${this.url}/lost`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "multipart/form-data",
},
body: formData,
timeout: this.timeout,
}))();
},
组件图像解析
const path = require("path");
const multer = require("multer");
const storage = multer.memoryStorage();
const limits = { fileSize: 2000000 };
const upload = multer({
storage,
limits,
fileFilter(req, file, cb) {
var filetypes = /jpeg|jpg|png|gif/;
const mimetype = filetypes.test(file.mimetype);
const extname = filetypes.test(
path.extname(file.originalname).toLocaleLowerCase()
);
if (mimetype && extname) {
return cb(null, true);
}
cb(
"Error: File upload only supports the following filetypes - " + filetypes
);
},
}).single("image");
function imageParse(req, res, next) {
upload(req, res, function (err) {
if (err) {
return res.status(422).json({ error: err.message });
}
next();
});
}
module.exports = imageParse;
组件路线
require("dotenv").config();
const express = require("express");
const logic = require("../logic");
const auth = require("./auth");
const imageParse = require("../utils/imageParse");
const literals = require("../i18n/literals");
const router = express.Router();
const { research_newPost_messageConfirm } = literals;
router.post("/lost", auth, imageParse, (req, res) => {
console.log(req.buffer);
const {
file: { buffer },
body: { userId, category, name, age, city, description, lang },
} = req;
(async () => {
try {
const user = await logic.newResearch(
buffer,
userId,
category,
name,
age,
city,
description,
lang
);
res.status(201).json({ message: research_newPost_messageConfirm[lang] });
} catch ({ message }) {
res.status(400).json({ error: message });
}
})();
});
module.exports = router;
组件逻辑api
const streamifier = require("streamifier");
const cloudinary = require("cloudinary").v2;
const { Research } = require("../models");
const {
CLOUDINARY_API_KEY,
CLOUDINARY_SECRET_KEY,
CLOUDINARY_NAME,
} = require("../utils/config");
const { logic_newPost_messageError} = require("../i18n/literals");
const logic = {
newResearch(buffer, userId, category, name, age, city, description, lang) {
try {
return (async () => {
cloudinary.config({
cloud_name: CLOUDINARY_NAME,
api_key: CLOUDINARY_API_KEY,
api_secret: CLOUDINARY_SECRET_KEY,
});
const image = await new Promise((resolve, reject) => {
const uploadStream = cloudinary.uploader.upload_stream(
(err, image) => {
if (err) throw new LogicError("Image could not be uploaded");
resolve(image);
}
);
streamifier.createReadStream(buffer).pipe(uploadStream);
});
const newPost = await Research.create({
owner: userId,
category,
name,
age,
city,
description,
image: image.secure_url,
});
if (!newPost) throw new Error(`${logic_newPost_messageError[lang]}`);
console.log("api", newPost);
return newPost;
})();
} catch (error) {
console.log(error);
}
},
};
module.exports = logic;
不是req.buffer
是req.file.buffer
您需要使用 memoryStorage,它允许您将文件作为 Buffer 对象存储在内存中。
制作类似的东西:
import multer, { memoryStorage } from 'multer';
const upload = multer({
storage: memoryStorage(),
dest: './tmp'
});
categoriesRoutes.post(
'/import',
upload.single('file'),
(req, res) => {
console.log(req.file.buffer)
}
);