无法使用 mongoose 更新 Mlab 文档的值,它被保存为“__v”:0

Posted

技术标签:

【中文标题】无法使用 mongoose 更新 Mlab 文档的值,它被保存为“__v”:0【英文标题】:Not able to update values of an Mlab document using mongoose, it is getting saved as "__v": 0 【发布时间】:2019-06-07 13:45:08 【问题描述】:

我是 node 和 mongoDb 的新手, 我有一个 mongo db 帐户,在其中创建了一个名为“dbTestData”的集合

我正在尝试使用 node express mongoose 和 express 创建 CRUD 操作, 我正在使用邮递员获取 mlab db 的更新和删除值。

我的 Get 调用工作正常,但是当我尝试在 Json 中发布值时,

我收到成功消息,但是当我检查数据库时,它被保存为


    "_id": 
        "$oid": "5c3ad1c19bc5932f800d26f7"
    ,
    "__v": 0

我的 app.js

const express = require('express');

const bodyParser = require("body-parser");
const mongoose=require('mongoose');
const app = express();
const dbTestData=require('./models/post')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));


mongoose.connect("mongodb://<userName>:<password>@ds221242.mlab.com:21242/kiitasklist").then(()=>
  console.log("hello");
).catch(
  ()=>
    console.log("heee");
  );

app.use((req, res, next) => 
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader(
      "Access-Control-Allow-Headers",
      "Origin, X-Requested-With, Content-Type, Accept"
    );
    res.setHeader(
      "Access-Control-Allow-Methods",
      "GET, POST, PATCH, PUT,DELETE, OPTIONS"
    );
    next();
  );

  app.post("/api/posts", (req, res, next) => 
    const post = new dbTestData(
      id:req.body.id,
      name:req.body.name
    );
    post.save().then(documents=>
      console.log(post);
      res.status(201).json(
        message: 'Post added successfully'
      );
    );
  );


app.get("/api/posts",(req,res,next)=>
  dbTestData.find().then(documents=>
  res.status(200).json(
    message:'Posts fetched successful',
    posts:documents
    );
);
);


app.put("/api/posts/:id",(req,res,next)=>
  const post = new dbTestData(
    _id:req.body._id,
    name:req.body.name
  );
  dbTestData.updateOne(_id:req.params.id,post).then(result=>
    res.status(200).json(message:"update successfully");
  );
);

app.delete("/api/posts/:id",(req,res,next)=>
  dbTestData.deleteOne(_id:req.params.id).then(documents=>
     res.status(200).json(
       message:'posts fetched successful',
       posts:documents
     );
   );
);

module.exports = app;

我的服务器.js

const http = require('http');
const app = require('./api/app');

const port = process.env.PORT || 3000;

const server = http.createServer(app);

server.listen(port);

我创建了猫鼬模式的 post.js

const mongoose=require('mongoose');

var Schema = mongoose.Schema; 
module.exports= mongoose.model("dbTestData", new Schema(), "DbTestData"); 

get 和 delete 都有效, 但是 post 和 put 没有正确发生,它在我的控制台中返回一条成功消息,但是像

这样的空值

    "_id": 
        "$oid": "5c3ad1c19bc5932f800d26f7"
    ,
    "__v": 0

在 POST 期间保存,在 PUT 期间没有任何反应。

【问题讨论】:

【参考方案1】:

解决这个帖子问题

var Schema = mongoose.Schema; 

PostSchema = new Schema(
 id:Number,
 name: String
);
// the compile the model using mongoos model function giving the schema u created
const Post = module.exports= mongoose.model("dbTestData", PostSchema, "DbTestData");

在你的post req之后这样做

//before posting you need to require the model first 
const Post = require('./models/post'); // your post.js
app.Post("/api/posts", (req, res, next) => 
    const post = new Post(
      id:req.body.id,
      name:req.body.name
    );
    post.save().then(documents=>
      console.log(post);
      res.status(201).json(
        message: 'Post added successfully'
      );
    );
  );

确保您正确地创建/定义您的架构,以便使用它来保存数据。 在你正确定义你的架构之后,你所做的事情应该可以正常工作

最后也试试这个。确保你添加这些拖链的方式与我在你的情况下给出的完全相同,你已经让它们切换了

// Body Parser Middleware
app.use(bodyParser.urlencoded( extended: false ));
app.use(bodyParser.json());

【讨论】:

哦,谢谢你,我没有正确创建我的架构,我只是使用一个空架构,添加架构后它现在可以正常工作了。 关于在每个 POST 或 PUT 上限制 _v 的任何想法?? 好吧,你可以抑制它,但不要这样做。他们建议你不要篡改 mongoose 内置的东西。实际上,这个 _v 是用来在更新 mongoose 时进行版本验证的。所以不用担心它不会影响您的应用程序 如果您觉得这很有帮助,请点击向上箭头为答案投票 :)

以上是关于无法使用 mongoose 更新 Mlab 文档的值,它被保存为“__v”:0的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 无法连接到 mLab 环境

javascript 使用MongoDB,mLab和Mongoose设置数据库

mLab 不适用于 Heroku

Mongoose & Express:从子文档发布数据

Mongoose & Express:从子文档发布数据

无法从 heroku 托管的 MEAN 应用程序访问 mLab 数据库