MongoDB和Cosmos DB密钥错误集合

时间:2018-04-19 11:44:38

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


我试图用Express& amp创建我的第一个MongoDB应用程序Angular& Azure Cosmos DB。
这是我的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失败_id或唯一键约束。

请帮忙!!

感谢。

1 个答案:

答案 0 :(得分:0)

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

如果您正在遵循Microsoft CosmosDB Angular教程,则可以克隆以下存储库并在本地进行测试。

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

如果您使用的是更新版本的猫鼬,则必须升级下面的连接字符串。

         //useMongoClient: true
         useNewUrlParser: true 
相关问题