req.file.stream 未定义
Posted
技术标签:
【中文标题】req.file.stream 未定义【英文标题】:req.file.stream is undefined 【发布时间】:2021-08-19 07:28:46 【问题描述】:我在使用节点 16 和 ES6 时遇到问题。我正在尝试制作一个上传文件控制器,但我遇到了未定义的 req.file.stream 我正在使用 multer 来处理上传文件。
第一个问题是 __dirname undefined,我可以使用路径和新 URL 来修复它。
我在管道中遇到的错误
node:internal/process/promises:246
triggerUncaughtException(err, true /* fromPromise */);
^
TypeError [ERR_INVALID_ARG_TYPE]: The "source" argument must be of type function or an instance of Stream, Iterable, or AsyncIterable. Received undefined
我的 userRoutes.js
import express from "express";
import signin, signup, logout from "../Controller/AuthController.js";
import
getUsers,
getUser,
updateUser,
deleteUser,
follow,
unfollow,
from "../Controller/UserController.js";
import upload from "../Controller/UploadController.js";
import multer from "multer";
const router = express.Router();
// Auth
router.post("/signin", signin);
router.post("/signup", signup);
router.post("/logout", logout);
// users
router.get("/", getUsers);
router.get("/:id", getUser);
router.patch("/:id", updateUser);
router.delete("/:id", deleteUser);
router.patch("/follow/:id", follow);
router.patch("/unfollow/:id", unfollow);
// upload
router.post("/upload", multer().single("file"), upload);
export default router;
还有我的 UploadController.js
import fs from "fs";
import promisify from "util";
import stream from "stream";
const pipeline = promisify(stream.pipeline);
// const uploadErrors = require("../utils/errors.utils");
import path from "path";
const __dirname = path.dirname(new URL(import.meta.url).pathname);
export const upload = async (req, res) =>
try
// console.log(req.file);
console.log(__dirname);
if (
!req.file.mimetype == "image/jpg" ||
!req.file.mimetype == "image/png" ||
!req.file.mimetype == "image/jpeg"
)
throw Error("invalid file");
if (req.file.size > 2818128) throw Error("max size");
catch (err)
const errors = uploadErrors(err);
return res.status(201).json( err );
const fileName = req.body.name + ".jpg";
await pipeline(
req.file.stream,
fs.createWriteStream(
`$__dirname/../client/public/uploads/profil/$fileName`
)
);
try
await User.findByIdAndUpdate(
req.body.userId,
$set: picture: "./uploads/profil/" + fileName ,
new: true, upsert: true, setDefaultsOnInsert: true ,
(err, docs) =>
if (!err) return res.send(docs);
else return res.status(500).send( message: err );
);
catch (err)
return res.status(500).send( message: err );
;
【问题讨论】:
【参考方案1】:Multer 将文件作为缓冲区而不是流提供给您。 req.file.stream
不是有效属性,但 req.file.buffer
是:https://github.com/expressjs/multer#file-information。
从您的代码的外观来看,您正在尝试将文件保存在磁盘上。为此,您可以使用 multer 的 DiskStorage
。创建一个存储实例并将其作为配置传递给 multer 实例:
const storage = multer.diskStorage(
destination: function (req, file, cb)
cb(null, `$__dirname/../client/public/uploads/profil/`);
,
filename: function (req, file, cb)
cb(null, req.body.name + '.jpg');
,
);
const upload = multer( storage );
router.post('/upload', upload.single('file'), upload);
看看这个免费的Request Parsing in Node.js Guide 在 Node.js 中处理文件上传。
【讨论】:
【参考方案2】:如果你想使用req.file.stream
,你需要安装这个版本的multer:
npm install --save multer@^2.0.0-rc.1
您的代码将完美运行,只需将您的 req.file.mimetype
更改为 req.file.detectedMimeType
!!
【讨论】:
以上是关于req.file.stream 未定义的主要内容,如果未能解决你的问题,请参考以下文章
“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP
“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP
“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP