【问题标题】:MongoDB and Cosmos DB key error collectionMongoDB 和 Cosmos DB 密钥错误收集
【发布时间】:2019-09-13 09:31:38
【问题描述】:


我正在尝试使用 Express & Angular & Azure Cosmos DB 创建我的第一个 MongoDB 应用程序。
这是我的js文件:

hero.model.js
 const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    const heroSchema = new Schema({
    id: {
      type: Number,
      required: true,
      unique: true
    },
    name: String
    }, {
    collection: 'Heroes'
    })
    const Hero = mongoose.model('Hero', heroSchema);
    module.exports = Hero;
mongo.js
 const mongoose = require('mongoose');
    mongoose.Promise = global.Promise;
    const env = require('./env/environment');
    const mongoUri = 
    mongodb:`${env.accountName}:${env.key}@${env.accountName}
    .documents.azure.com:10255/?ssl=true`
    function connect() {
    mongoose.set('debug', true);
    return mongoose.connect(mongoUri)
    }
    module.exports = {
    connect,
    mongoose
    };
index.js
   const express = require('express');
    const bodyParser = require('body-parser');
    const path = require('path');
    const routes = require('./routes');
    const root = './';
    const port = process.env.PORT || '3000';
    const app = express();
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(express.static(path.join(root, 'docs')));
    app.use('/api', routes);
    app.get('*', (req, res) => {
    res.sendFile('docs/index.html', {root});
    });
route.js
  const express = require('express');
    const router = express.Router();
    const heroService = require('./hero.service');
    router.get('/heroes', (req, res) => {
    heroService.getHeroes(req, res);
    });
    router.post('/hero', (req, res) => {
    heroService.postHero(req, res);
    });
    router.put('/hero/:id', (req, res) => {
    heroService.putHero(req, res);
    });
    router.delete('/hero/:id', (req, res) => {
    heroService.deleteHero(req, res);
    });
    module.exports = router;
    app.listen(port, () => console.log(`API running on 
    localhost:${port}`));
hero.service.js
 const Hero = require('./hero.model');
    require('./mongo').connect();
    function getHeroes(req, res) {
    const docquery = Hero.find({});
    docquery
    .exec()
    .then(heroes => {
      res.status(200).json(heroes);
    })
    .catch(error => {
      res.status(500).send(error);
      return;
    });
    }
    function postHero(req, res) {
    const originalHero = {
    id: req.body.id,
    name: req.body.name
    };
    const hero = new Hero(originalHero);
    hero.save(error => {
    if (checkServerError(res, error)) return;
    res.status(201).json(hero);
    console.log('Hero created successfully!');
    });
    }
    function checkServerError(res, error) {
    if (error) {
    res.status(500).send(error);
    return error;
    }
    }
    function putHero(req, res) {
    const originalHero = {
    id: parseInt(req.params.id, 10),
    name: req.body.name
    };
    Hero.findOne({
    id: originalHero.id
    }, (error, hero) => {
    if (checkServerError(res, error)) return;
    if (!checkFound(res, hero)) return;

    hero.name = originalHero.name;
    hero.save(error => {
      if (checkServerError(res, error)) return;
      res.status(200).json(hero);
      console.log('Hero updated successfully!');
    });
    });
    }
    function deleteHero(req, res) {
    const id = parseInt(req.params.id, 10);
    Hero.findOneAndRemove({
      id: id
    })
    .then(hero => {
      if (!checkFound(res, hero)) return;
      res.status(200).json(hero);
      console.log('Hero deleted successfully!');
    })
    .catch(error => {
      if (checkServerError(res, error)) return;
    });
    }
    function checkFound(res, hero) {
    if (!hero) {
    res.status(404).send('Hero not found.');
    return;
    }
    return hero;
    }
    module.exports = {
     getHeroes,
     postHero,
     putHero,
     deleteHero
    };

它只在我第一次发布新英雄并且第二次给我一个错误时才有效: E11000 重复键错误收集:admin.Heroes Failed _id or unique key constraint。

请帮忙!!

谢谢。

【问题讨论】:

  • id 和 _id 在猫鼬中的意思相同。它是 MongoDB 中的主键。您似乎总是发送相同的值。也无需在架构中标记为 unique,因为这是“隐含”的主键。
  • 我检查我的数据 [ { "_id": "5ad859e64deacd31b934c74f", "id": 1, "name": "Superman", "__v": 0 } ] 我是否需要更改 Schema 配置?
  • 我正在学习相同的教程并遇到相同的问题。你搞清楚了吗?
  • 我也有同样的问题。你解决了吗?

标签: node.js mongodb azure express mongoose-schema


【解决方案1】:

我知道这已经有一段时间了,但我遇到了同样的问题。解决方案是避免使用字段名称 id,将其重命名为 UID 或其他名称。完成后,您必须删除整个集合并重新启动。

如果您正在学习 Microsoft CosmosDB Angular 教程,您可以克隆下面的 repo 并在本地进行测试。

https://github.com/Azure-Samples/angular-cosmosdb

如果您使用的是较新版本的 mongoose,您必须升级下面的连接字符串。

         //useMongoClient: true
         useNewUrlParser: true 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多