You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:30:42