我的本地MongoDB实例没有通过Express和Mongoose保存数据

问题描述:

所以这是在控制台中工作,但不写入数据库。当我重新启动服务器时,数据只是重置。它从数据库读取就好了,只是没有保存。我正在运行mongo shell,并明确地从中取出数据,而不是像我想要的那样更新或创建数据。下面是我的server.js文件中的代码:我的本地MongoDB实例没有通过Express和Mongoose保存数据

var express = require('express'); 
    var mongoose = require('mongoose'); 
    var Schema = mongoose.Schema; 
    var bodyParser = require('body-parser'); 
    var app = express(); 

    mongoose.Promise = global.Promise; 
    mongoose.connect('mongodb://localhost:27017/food'); 


    //Allow all requests from all domains & localhost 
    app.all('/*', function(req, res, next) { 
     res.header("Access-Control-Allow-Origin", "*"); 
     res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept"); 
     res.header("Access-Control-Allow-Methods", "POST, GET"); 
     next(); 
    }); 

    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({extended: false})); 


    var usersSchema = new Schema({ 
     _id: String, 
     id: String, 
     vote: Number 
    }); 

    var bkyes = mongoose.model('bkyes', usersSchema); 


    app.post('/bkyes', function(req, res, next) { 

    bkyes.find({}, function(err, foundObject) { 
     console.log(foundObject); //Print pre-update 
     var found = foundObject[0]; 
     found.vote = req.body.vote; //Passing in the number 5 here(was -1 before) 
     found.save(function(err) { 

      console.log(foundObject); //Print post-update 
     }); 
     }); 
    }); 


    app.listen(3000); 

    /* 
    The console.log pre-update: 
    [ { _id: '582b2da0b983b79b61da3f9c', id: 'Burger King', vote: -1 } ] 
                   ^
    The console.log post-update: 
    [ { _id: '582b2da0b983b79b61da3f9c', id: 'Burger King', vote: 5 } ] 
                   ^
    However this data does NOT write to the db and just resets when you restart the server!! 
    */ 
+0

检查你'req.body.vote',这是一个数字吗? – Khang

+0

它是从前端传入的。正如你可以在底部的注释部分看到的,它正在更新Mongo BSON,而不是将它保存到数据库。当我检查shell时,它并未真正写入。 – jdev99

+0

使用findOneAndUpdate()而不是查找然后保存 – Sam

foundObjects不受save()功能反正效果,所以日志是一种无用的。

我不知道为什么你想找到bkyes中的每个文件并获得第一个文件。你经常会发现一些有条件的文档,通常是_id字段。

无论如何,这里是与findOneAndUpdate()一个例子:

bkyes 
    .findOneAndUpdate({ 
    // Conditions 
    _id: '00001' 
    }, { 
    // Set which fields to update 
    vote: 5 
    }) 
    .exec(function(err, foundObject) { 
    if (err) { 
     // Error handler here 
    } 

    // Do something when update successfully 
    }); 

注意:foundObject是更新前的对象

+0

嗨,感谢您的回复,Mongo文档有点神秘。在4:16这个视频里,这个人成功地使用了foundObject.save(),所以这就是我从中获得的地方。 https://youtu.be/5_pvYIbyZlU?t=4m16s另外,我发现价值是我接下来要处理的,我只想在此之前看到它的节省。让我知道你的想法,我感谢你的意见。 – jdev99

+0

在那个视频中,那个人使用'findOne()',它会返回一个对象,或者当你使用'find()'时它将返回一个数组。 Mongoose'save()'方法只适用于模型。 – willie17

+0

好吧,现在我正在使用'findOneAndUpdate()',现在记录'foundObject'现在返回null ..我可能有语法错误的'findOneAndUpdate()',我会深入研究文档,如果您有任何其他建议,请随意射击。 – jdev99