Node.js+Express中类使用与数据存储失败问题求助
解决Express中
req.body.par未定义及类导出相关问题 看起来你被几个基础但关键的问题卡住了,我来一步步帮你理清:
1. 核心错误根源:未解析表单请求体
你遇到的TypeError: Cannot read property 'par' of undefined,本质是Express默认不会自动解析表单提交的URL-encoded数据,导致req.body是undefined,自然拿不到req.body.par。
解决方法:
在你的项目主入口文件(比如app.js)中添加表单解析中间件:
// Express 4.16+ 版本可以直接用内置的中间件,无需额外安装依赖 app.use(express.urlencoded({ extended: true })); // 如果是低于4.16的旧版本,先执行 npm install body-parser,再用下面的代码: // const bodyParser = require('body-parser'); // app.use(bodyParser.urlencoded({ extended: true }));
2. 路由代码的逻辑错误
你的admin.js里有个非常影响逻辑的问题:在POST路由内部嵌套了GET路由,这会导致每次表单提交时都重复注册根路由,完全打乱路由规则。必须把GET路由移到POST外面:
修正后的routes/admin.js:
const express= require('express'); const router = express.Router(); const Nome = require('../models/parola'); // 单独定义根路由,渲染home页面 router.get('/',(req,res,next)=>{ res.render('home'); }); // 处理表单提交的POST请求 router.post('/process',(req,res,next)=>{ // 现在req.body应该能正常获取表单数据了 const nomi= new Nome(req.body.par); nomi.save(); res.redirect('/lista'); }); // 单独定义渲染lista页面的路由 router.get('/lista',(req,res,next)=>{ res.render('lista'); }); module.exports=router;
3. 类定义文件的语法漏洞
你的parola.js有两处语法错误,直接导致类导出和方法执行异常:
getFile函数缺少闭合括号static fetchAll方法没有正确实现回调逻辑
修正后的../models/parola.js:
const path=require('path'); const fs= require('fs'); const p = path.join(path.dirname(process.mainModule.filename), 'data','saving.json'); // 补全getFile函数的闭合括号 const getFile = cb =>{ fs.readFile(p,(err,fileContent)=>{ if (err) { cb([]); }else{ cb(JSON.parse(fileContent)); } }); }; module.exports = class Nome{ constructor(p){ this.par = p; }; save () { getFile(nomi=>{ nomi.push(this); fs.writeFile(p,JSON.stringify(nomi),err=>{ if(err) console.log(err); // 建议加上错误判断 }); }); } // 修正fetchAll方法,正确传递回调参数 static fetchAll(cb){ getFile(cb); } };
额外小提示
- 确保你的表单输入框的
name属性是par,比如<input type="text" name="par">,否则req.body.par还是拿不到值。 - 因为
save()是异步操作,如果需要确保数据保存完成后再重定向,可以给save加个回调:
// 修改save方法 save(cb) { getFile(nomi => { nomi.push(this); fs.writeFile(p, JSON.stringify(nomi), err => { if(err) console.log(err); if(cb) cb(); // 执行回调 }); }); } // 在路由中调用 nomi.save(() => { res.redirect('/lista'); });
内容的提问来源于stack exchange,提问作者user10663534
相关产品推荐
相关产品推荐

