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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:01:29