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 || "服务器内部错误") } })
额外优化
- 新增帖子存在性检查,避免因无效
postid导致的错误 - 统一错误处理逻辑,将所有异步操作包裹在
try/catch中,防止进程崩溃 - 返回更清晰的错误提示,方便调试
内容的提问来源于stack exchange,提问作者skforiss
相关产品推荐
相关产品推荐

