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

Node.js博客编辑内容时报错TypeError: Cannot read properties of undefined (reading 'path')

Node.js博客编辑功能无图片上传时崩溃的解决方案

问题现象

用Node.js搭建的博客应用,支持发布和编辑功能:

  • 同时更新图片和文本时功能正常
  • 仅编辑内容不上传新图片时,页面显示**“无法访问此网站,localhost拒绝连接(ERR_CONNECTION_REFUSED)”**,终端报错:
E:\routes\web\post.js:67
post.image = req.file.path

TypeError: Cannot read properties of undefined (reading 'path')
at E:\routes\web\post.js:67:27
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

相关代码

post.js路由文件

var express = require("express")
var multer = require("multer")
var crypto = require("crypto")
var path = require("path")

var ensureAuthenticated = require("../../auth/auth").ensureAuthenticated

var Post = require("../../models/post")

var router = express.Router()

var storage = multer.diskStorage({
    destination: './uploads/images/',
    filename: function(req, file, cb){
        crypto.pseudoRandomBytes(16, function(err, raw){
            cb(null, raw.toString('hex') + Date.now() + path.extname(file.originalname))
        })
    }
})

var upload = multer({storage:storage})

router.use(ensureAuthenticated)

router.get("/", function(req, res){
    Post.find({userID: req.user._id}).exec(function(err,posts){
        if(err){console.log(err)}

        res.render("post/posts", {posts:posts})
    })
})

router.get("/add", function(req, res){
    res.render("post/addpost")
})

router.post("/add", function(req, res){
    var newPost = new Post({
        title: req.body.title,
        content: req.body.content,
        userID: req.user._id
    })

    newPost.save(function(err, post){
        if(err){console.log(err)}
        res.redirect("/posts")
    })
})

router.get("/:postId", function(req, res){
    Post.findById(req.params.postId).exec(function(err, post){
        res.render("post/viewpost", {post: post})
    })
})

router.get("/edit/:postId", function(req, res){
    Post.findById(req.params.postId).exec(function(err, post){
        res.render("post/editpost", {post: post})
    })
})

router.post("/update", upload.single('image'), async function(req, res){
    const post = await Post.findById(req.body.postid)

    post.title = req.body.title
    post.content = req.body.content
    post.image = req.file.path

    // post.save()

    try{
        let savePost = await post.save()
        console.log("savepost", savePost)
        res.redirect("/posts/" + req.body.postid)

    } catch (err) {
        console.log("Error happened")
        res.status(500).send(err)
    }

})


module.exports = router

editpost.ejs模板文件

<%- include('../_partial/_header'); -%>
 
 
<div class="row">
    <div class="col-md-6">
        <h1>Edit Post: <%= post.title %></h1>
    </div>
</div>
 
<div class="row">
    <div class="col-md-6">
        <form action="/posts/update" method="POST" enctype="multipart/form-data">
            <div class="form-group">
 
                <label for="inputTitle">Title</label>
                <input type="text" class="form-control" placeholder="Title" id="inputTitle" name="title"
                    value="<%= post.title %>"
                />
            </div>
 
            <div class="form-group">
                <label for="inputContent">Content</label>
                <textarea class="form-control" rows="3" id="inputContent" placeholder="Content" name="content"><%= post.content %></textarea>
            </div>

            <input type="hidden" id="postid" name="postid" value="<%= post._id %>">
 
            <div class="form-group">
                <input type="file" name="image">
            </div>

            <div class="form-group">
                <button type="submit" class="btn btn-default" href="#" role="button">Update</button>
            </div>
    </div>
 
    </form>
</div>
 
 
 
<%- include ('../_partial/_footer'); -%>

解决方案

错误根源是:当用户未上传新图片时,multer不会生成req.file对象,此时直接访问req.file.path会触发TypeError,导致Node.js进程崩溃,所以页面出现连接拒绝。

修复步骤

修改post.js中的/update路由,添加req.file存在性判断,仅当有新图片上传时才更新post.image字段:

router.post("/update", upload.single('image'), async function(req, res){
    try{
        // 先检查帖子是否存在
        const post = await Post.findById(req.body.postid)
        if(!post) {
            return res.status(404).send("该帖子不存在")
        }

        // 更新标题和内容
        post.title = req.body.title
        post.content = req.body.content
        // 仅当上传了新图片时更新image字段
        if(req.file) {
            post.image = req.file.path
        }

        // 保存更新
        let savePost = await post.save()
        console.log("savepost", savePost)
        res.redirect("/posts/" + req.body.postid)

    } catch (err) {
        console.log("Error happened", err)
        // 返回友好的错误信息
        res.status(500).send(err.message || "服务器内部错误")
    }
})

额外优化

  1. 新增帖子存在性检查,避免因无效postid导致的错误
  2. 统一错误处理逻辑,将所有异步操作包裹在try/catch中,防止进程崩溃
  3. 返回更清晰的错误提示,方便调试

内容的提问来源于stack exchange,提问作者skforiss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:15:34