NodeJS & Multer:如果发生错误则停止上传文件
NodeJS & Multer: stop uploading file if error occurs
你好,我用 Node & Multer 创建文件上传,它可以工作,但问题是如果发生错误(比如用户没有填写其他字段)它仍然会上传我不想要的文件
我真的不知道该怎么做,因为我是第一次这样做,所以希望如果有人有这方面的经验。这是我的代码
const storage = multer.diskStorage({
destination: (req, file, callback) => {
const userPath = path.join(imgStoragePath, req.userId);
fs.mkdir(
userPath,
() => callback(null, userPath)
)
},
filename: (req, file, callback) => {
const filenameParts = file.originalname.split('.');
const ext = filenameParts.pop();
const basename = filenameParts.join('.');
const additionalPath = Date.now() + '' + uuid() + '' +
Math.floor(Math.random() * (2000 - 500)) + 500;
callback(null, basename + '-' + additionalPath + '.' + ext);
}
})
const upload = multer({
storage,
limits: '1mb'
})
router.post('/', upload.single('image'), async (req, res) => {
//code
})
如果发生错误,它应该 return 错误消息并将其发送到服务器并停止代码执行并且什么都不做,它会执行但还会上传文件,我知道这会发生,因为 upload
是中间件,中间件首先执行,我希望它能阻止它。谢谢!
app.post('/upload',[
multer({
dest : './uploads/',
onError : function(err, next) {
console.log('error', err);
next(err);
}
}),
function(req, res) {
res.status(204).end();
}
]);
//从 multer 文档 https://github.com/expressjs/multer#error-handling
查看这个 link
好的,multer 并不真正负责验证您的表单输入,它的唯一目的是允许您将文件上传到后端。现在开始您要解决的问题
- 您可以在前端进行 html 验证,以确保用户在提交表单之前填写所有
required
字段
- 您可以进行后端检查以确保已填写所有必填字段
为了使用第二步,您可以使用这样的函数
export const setRequired = (...args: any): boolean => {
let isValid = true;
_.forEach(args, value => {
if (isUndefined(value)) isValid = false;
});
return isValid;
};
const isValid: any = setRequired(file, first_name, last_name);
该函数使用 typescript 和 lodash 并检查指定的所有参数是否存在。因此,在您在后端执行任何操作之前,将必填字段传递给函数,该函数将 return 一个布尔值,以通知您是否已从前端收到所有必填字段。
关于 multer 的文件大小和文件类型错误的第 2 部分,您可以这样尝试
const storage = multer.diskStorage({
destination(req, file, cb) {
cb(null, path.join(__dirname, `path_to_folder`));
},
filename(req, file, cb) {
const ext = path.extname(file.originalname).toLowerCase();
const file_name = uuidv4() + "_" + ext;
cb(null, file_name);
},
});
const upload = multer({
storage,
limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
fileFilter(req, file, cb) {
const ext = path.extname(file.originalname).toLowerCase();
if (ext !== ".png" && ext !== ".jpg" && ext !== ".jpeg") {
cb(new Error("Error: Unacceptable file format"), false);
} else {
cb(null, true);
}
},
}).any();
router.post("/", (req, res) => {
upload(req, res, async err => {
if (err) {
console.error(err);
// An unknown error occurred when uploading.
// the err object will contain the reason for the multer error
}
if (req.files && req.files[0]) {
// file has been saved
console.log(req.files[0].filename);
}
});
},
);
你好,我用 Node & Multer 创建文件上传,它可以工作,但问题是如果发生错误(比如用户没有填写其他字段)它仍然会上传我不想要的文件
我真的不知道该怎么做,因为我是第一次这样做,所以希望如果有人有这方面的经验。这是我的代码
const storage = multer.diskStorage({
destination: (req, file, callback) => {
const userPath = path.join(imgStoragePath, req.userId);
fs.mkdir(
userPath,
() => callback(null, userPath)
)
},
filename: (req, file, callback) => {
const filenameParts = file.originalname.split('.');
const ext = filenameParts.pop();
const basename = filenameParts.join('.');
const additionalPath = Date.now() + '' + uuid() + '' +
Math.floor(Math.random() * (2000 - 500)) + 500;
callback(null, basename + '-' + additionalPath + '.' + ext);
}
})
const upload = multer({
storage,
limits: '1mb'
})
router.post('/', upload.single('image'), async (req, res) => {
//code
})
如果发生错误,它应该 return 错误消息并将其发送到服务器并停止代码执行并且什么都不做,它会执行但还会上传文件,我知道这会发生,因为 upload
是中间件,中间件首先执行,我希望它能阻止它。谢谢!
app.post('/upload',[
multer({
dest : './uploads/',
onError : function(err, next) {
console.log('error', err);
next(err);
}
}),
function(req, res) {
res.status(204).end();
}
]);
//从 multer 文档 https://github.com/expressjs/multer#error-handling
查看这个 link好的,multer 并不真正负责验证您的表单输入,它的唯一目的是允许您将文件上传到后端。现在开始您要解决的问题
- 您可以在前端进行 html 验证,以确保用户在提交表单之前填写所有
required
字段 - 您可以进行后端检查以确保已填写所有必填字段
为了使用第二步,您可以使用这样的函数
export const setRequired = (...args: any): boolean => {
let isValid = true;
_.forEach(args, value => {
if (isUndefined(value)) isValid = false;
});
return isValid;
};
const isValid: any = setRequired(file, first_name, last_name);
该函数使用 typescript 和 lodash 并检查指定的所有参数是否存在。因此,在您在后端执行任何操作之前,将必填字段传递给函数,该函数将 return 一个布尔值,以通知您是否已从前端收到所有必填字段。
关于 multer 的文件大小和文件类型错误的第 2 部分,您可以这样尝试
const storage = multer.diskStorage({
destination(req, file, cb) {
cb(null, path.join(__dirname, `path_to_folder`));
},
filename(req, file, cb) {
const ext = path.extname(file.originalname).toLowerCase();
const file_name = uuidv4() + "_" + ext;
cb(null, file_name);
},
});
const upload = multer({
storage,
limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
fileFilter(req, file, cb) {
const ext = path.extname(file.originalname).toLowerCase();
if (ext !== ".png" && ext !== ".jpg" && ext !== ".jpeg") {
cb(new Error("Error: Unacceptable file format"), false);
} else {
cb(null, true);
}
},
}).any();
router.post("/", (req, res) => {
upload(req, res, async err => {
if (err) {
console.error(err);
// An unknown error occurred when uploading.
// the err object will contain the reason for the multer error
}
if (req.files && req.files[0]) {
// file has been saved
console.log(req.files[0].filename);
}
});
},
);