Postman POST请求正常,Angular发起POST无法创建MongoDB记录
问题描述
尝试通过Angular前端调用接口在MongoDB中创建新记录,发起POST请求后无任何报错,但记录并未创建成功。用Postman发起相同请求却能正常创建记录。
后端代码
const express = require('express'); const router = express.Router(); const Munkafolyamat = require('../models/munkafolyamat'); router.post('/addmunka', async (req, res) => { console.log('made it to backend') const munka = new Munkafolyamat({ title: req.body.title, description: req.body.description, completed: req.body.completed }); try { const newMunka = await munka.save(); res.status(201).json(newMunka); } catch (error) { res.status(400).json({ message: error.message }); } });
前端API服务代码
createMunka(munka: any): Observable<any> { return this.http.post(`${this.apiUrl}/munkas/addmunka`,munka); }
组件调用服务代码
save(){ this.teendo.elvegezte='jani'; this.teendo.todo='megkőcsináni'; this.teendok.push(this.teendo) this.munka.inditotta=this.inditotta; this.munka.iroda=this.iroda; this.munka.tipus=this.tipus; this.munka.eszkozlista=this.eszkozlista; this.munka.status=this.status; this.munka.teendok=this.teendok; console.log('munka: ', this.munka); this.apiService.createMunka(this.munka) }
Mongoose Schema代码
const mongoose = require('mongoose'); const munkafolyamatSchema = new mongoose.Schema({ tipus:String, inditotta:String, iroda:String, status:String, eszkozlista:[String], teendok:[{elvegezte:String,todo:String}] }); module.exports = mongoose.model('Munkafolyamat', munkafolyamatSchema, 'Munkafolyamat');
问题排查与修复
核心问题1:后端字段不匹配
后端创建Munkafolyamat实例时使用了title、description、completed字段,但Schema中根本没有定义这些字段,反而前端传递的是Schema里的tipus、inditotta等字段。Mongoose默认会过滤Schema不存在的字段,导致保存的是无效空数据,且不会抛出错误。
核心问题2:Angular请求未订阅
Angular的HTTP请求是冷Observable,必须调用subscribe()才会实际发送请求。组件中仅调用了createMunka方法但未订阅,请求根本没有发出。
修复步骤
1. 修正后端代码
将创建实例的字段替换为Schema中定义的字段:
router.post('/addmunka', async (req, res) => { console.log('made it to backend') const munka = new Munkafolyamat({ tipus: req.body.tipus, inditotta: req.body.inditotta, iroda: req.body.iroda, status: req.body.status, eszkozlista: req.body.eszkozlista, teendok: req.body.teendok }); try { const newMunka = await munka.save(); res.status(201).json(newMunka); } catch (error) { res.status(400).json({ message: error.message }); } });
2. 修正前端组件代码
为HTTP请求添加订阅,同时处理响应和错误:
save(){ this.teendo.elvegezte='jani'; this.teendo.todo='megkőcsináni'; this.teendok.push(this.teendo) this.munka.inditotta=this.inditotta; this.munka.iroda=this.iroda; this.munka.tipus=this.tipus; this.munka.eszkozlista=this.eszkozlista; this.munka.status=this.status; this.munka.teendok=this.teendok; console.log('munka: ', this.munka); this.apiService.createMunka(this.munka) .subscribe({ next: (response) => console.log('创建成功:', response), error: (err) => console.error('创建失败:', err) }); }
内容的提问来源于stack exchange,提问作者Callistron
相关产品推荐
相关产品推荐

