Mongoose仅保存_id和_v

5

这确实是一个重复的问题,但没有答案。

问题在于,当我通过post请求使用mongoose保存新记录时,保存的只是类似于这样的内容:

{ "_id" : ObjectId("5d11590975c82f216eaa4712"), "__v" : 0 }

我正在按照这个教程操作,所以代码应该可以正常运行。以下是代码:

mongoose模式:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

let Todo = new Schema({
    todo_description: {
        type: String
    },
    todo_responsible: {
        type: String
    },
    todo_priority: {
        type: String
    },
    todo_completed: {
        type: Boolean
    }
});
module.exports = mongoose.model('Todo', Todo);

代码:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
const todoRoutes = express.Router();
const PORT = 4000;

let Todo = require('./todo.model');

app.use(cors());
app.use(bodyParser.json());

mongoose.connect('mongodb://127.0.0.1:27017/todos', { useNewUrlParser: true });
const connection = mongoose.connection;

connection.once('open', function() {
    console.log("MongoDB database connection established successfully");
})

todoRoutes.route('/').get(function(req, res) {
    Todo.find(function(err, todos) {
        if (err) {
            console.log(err);
        } else {
            res.json(todos);
        }
    });
});

todoRoutes.route('/:id').get(function(req, res) {
    let id = req.params.id;
    Todo.findById(id, function(err, todo) {
        res.json(todo);
    });
});

todoRoutes.route('/update/:id').post(function(req, res) {
    Todo.findById(req.params.id, function(err, todo) {
        if (!todo)
            res.status(404).send("data is not found");
        else
            todo.todo_description = req.body.todo_description;
            todo.todo_responsible = req.body.todo_responsible;
            todo.todo_priority = req.body.todo_priority;
            todo.todo_completed = req.body.todo_completed;

            todo.save().then(todo => {
                res.json('Todo updated!');
            })
            .catch(err => {
                res.status(400).send("Update not possible");
            });
    });
});

todoRoutes.route('/add').post(function(req, res) {
    let todo = new Todo(req.body);
    todo.save()
        .then(todo => {
            res.status(200).json({'todo': 'todo added successfully'});
        })
        .catch(err => {
            res.status(400).send('adding new todo failed');
        });
});

app.use('/todos', todoRoutes);

app.listen(PORT, function() {
    console.log("Server is running on Port: " + PORT);
});

POST 请求: post request GET 请求: get request

为了确认,以下是 MongoDB 的输出: mongodb


我尝试了这个例子,它可以保存所有字段的数据。请检查req.body是否为空。如果req.body为空,则只会保存_id和_v。因为如果请求中没有传递字段,那么就不会对其进行验证。 - Jaspreet kaur
我确定请求体不为空,我尝试了很多次。 - LonelyDaoist
您发送的请求很可能是问题所在。请将完整细节添加到问题中。 - JohnnyHK
@LonelyDaoist 当你在Postman上添加数据时,你需要将body选择为“application/json”,然后再发送API请求。同时,在API入口处应用验证,如果req.body为空或null,则在响应中发送错误,这样你也可以检查问题所在。 - Jaspreet kaur
5个回答

6

问题在于body需要是Json(application/json)格式而不是文本格式

在这里输入图片描述


0

你的代码一切正常

只需在你的 todo.model.js 文件中添加这行代码即可

module.exports = mongoose.model('Todo', Todo);

抱歉,似乎我在提问时没有复制那一行代码,但这并不是问题的根源。 - LonelyDaoist

0

Dashboard

1

编辑:

我也遇到了这个问题,我修复了 Content-type: application/json,然后它就正常工作了。


0
请确保在您的server.js文件中添加了app.use(express.json())。

0

尝试使用body-parser并使用:

app.use(bodyParser.json());

app.js 文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接