Node.js fs模块报错:path参数类型无效,接收undefined
Formidable文件上传路径参数错误解决
问题代码
const Blog = require('../models/blog'); const formidable = require('formidable'); const slugify = require('slugify'); const stripHtml = require('string-strip-html'); const _ = require('lodash'); const { errorHandler } = require('../helpers/dbErrorHandler'); const fs = require('fs'); exports.create = (req, res) => { let form = new formidable.IncomingForm() form.keepExtensions = true form.parse(req, (err, fields, files) => { if(err) { return res.status(400).json({ error: 'Image could not be uploaded' }); }; const { title, body, categories, tags} = fields let blog = new Blog(); blog.title = title; blog.body = body; blog.slug = slugify(title).toLowerCase(); blog.mtitle = `${ title } | ${ process.env.APP_NAME }`; blog.mdesc = stripHtml(body.substring(0,160)); blog.postedBy = req.user._id; if(files.photo) { if(files.photo.size > 10000000) { return res.status(400).json({ error: 'Image should be less then 1mb in size' }); } blog.photo.data = fs.readFile(files.photo.path); blog.photo.contentType = files.photo.type; } blog.save((err, result) => { if(err){ return res.status(400).json({ error: errorHandler(err) }); } res.json(result); }) }); };
错误信息
node:internal/fs/utils:676 throw new ERR_INVALID_ARG_TYPE(propName, ['string', 'Buffer', 'URL'], path); ^ TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string or an instance of Buffer or URL. Received undefined at Object.openSync (node:fs:592:10) at Object.readFileSync (node:fs:468:35) at /Users/XXX/backend/controllers/blog.js:37:34 at zalgoSafe (/Users/XXX/backend/node_modules/dezalgo/dezalgo.js:20:10) at f (/Users/XXX/backend/node_modules/once/once.js:25:25) at IncomingForm.<anonymous> (/Users/XXX/backend/node_modules/formidable/src/Formidable.js:183:9) at IncomingForm.emit (node:events:513:28) at IncomingForm._maybeEnd (/Users/XXX/backend/node_modules/formidable/src/Formidable.js:612:10) at /Users/XXX/backend/node_modules/formidable/src/Formidable.js:390:14 at Array.<anonymous> (/Users/XXX/backend/node_modules/formidable/src/PersistentFile.js:77:7) { code: 'ERR_INVALID_ARG_TYPE' }
解决方法
核心问题
Formidable v2.x版本对文件对象属性做了两处关键修改:
- 原文件路径属性
path改为filepath - 原文件类型属性
type改为mimetype - 同时
fs.readFile是异步方法,直接赋值会得到Promise而非文件内容,需用同步读取方法fs.readFileSync
修改后的关键代码段
if(files.photo) { if(files.photo.size > 10000000) { return res.status(400).json({ error: 'Image should be less than 1mb in size' }); } // 替换为新版本属性,用同步方法读取文件内容 blog.photo.data = fs.readFileSync(files.photo.filepath); blog.photo.contentType = files.photo.mimetype; }
额外可选方案(异步读取)
若需使用异步读取,需将blog.save放在fs.readFile回调内,避免未读取完文件就执行保存:
fs.readFile(files.photo.filepath, (err, data) => { if (err) { return res.status(400).json({ error: 'Failed to read image file' }); } blog.photo.data = data; blog.photo.contentType = files.photo.mimetype; blog.save((err, result) => { if(err){ return res.status(400).json({ error: errorHandler(err) }); } res.json(result); }); });
必要检查
确认Postman中form-data的文件字段名是photo,与代码中files.photo的字段名完全匹配。
内容的提问来源于stack exchange,提问作者lhest
相关产品推荐
相关产品推荐

