首页 > 解决方案 > 试图用 Mongoose 播种 DB。在添加关系数据时循环 JSON

问题描述

我正在尝试为 React 学校作业播种数据库,此处的代码从JSON对象创建两个集合,但我试图在循环中实现的关系不起作用。

当我在启动服务器后使用邮递员添加假期时,关系有效。控制台登录 create promise 只会将第一个对象写入终端。forEach在看到使用的建议之前,我正在使用async.

种子.js

const mongoose = require("mongoose");
const db = require("../models");
var async = require('async');


mongoose.connect(process.env.MONGODB_URI || "mongodb://localhost/app", { useUnifiedTopology: true, useNewUrlParser: true, useFindAndModify: false });



const userSeed = [
  {
    name: "Bill",
    email: "bill@bill.com",
    password: "waewfeawf",
    vacations: []
  }
];

const vacaSeed = [
  {
    "email": "bill@bill.com",
    "name": "Vaawdawddver!",
    "startDate": "2019-12-2",
    "endDate": "2019-12-6",
    "location": "Alaska",
    "activities": ["camping", "biking", "hiking", "fishing"]
  },
  {
    "email": "bill@bill.com",
    "name": "Future!",
    "startDate": "2020-12-2",
    "endDate": "2020-12-6",
    "location": "Alaska",
    "activities": ["camping", "biking", "hiking", "fishing"]
  },
  {
    "email": "bill@bill.com",
    "name": "Vaawdawddver1!",
    "startDate": "2019-12-2",
    "endDate": "2019-12-6",
    "location": "Alaska",
    "activities": ["camping", "biking", "hiking", "fishing"]
  },
  {
    "email": "bill@bill.com",
    "name": "Vaawdawddver2!",
    "startDate": "2019-12-2",
    "endDate": "2019-12-6",
    "location": "Alaska",
    "activities": ["camping", "biking", "hiking", "fishing"]
  },
]

db.User
  .deleteMany({})
  .then(() => db.User.collection.insertMany(userSeed))
  .then(data => {
    console.log(data);
    process.exit(0);
  })
  .catch(err => {
    console.error(err);
    process.exit(1);
  });


db.Vacation
  .deleteMany({})
  .then(data => {
    // console.log(data)
    process.exit(0);
  })
  .catch(err => {
    console.error(err);
    process.exit(1);
  });

async.each(vacaSeed, function (data, callback) {
  db.Vacation
    .create(data)
    .then(dbModel => {
      db.User.findOneAndUpdate({ email: data.email }, { $push: { vacations: dbModel._id } }, { new: true })
        .catch(err => console.log(err));
    })
})




控制器代码- 工作

create: function (req, res) {
    db.Vacation
      .create(req.body)
      .then(dbModel => {
        return db.User.findOneAndUpdate({ email: req.body.email }, { $push: { vacations: dbModel._id } }, { new: true }).then(dbUser => res.json(dbUser)).catch(err => res.status(422).json(err));
      })
  },

标签: javascriptnode.jsmongodbmongoose

解决方案


我最终将两个 Vacation DB 调用合并为一个调用,同时在到达 JSON 对象末尾时关闭 mongoose 连接。

db.Vacation
  .deleteMany({})
  .then(data => {
    vacaSeed.forEach((item, idx, vacaSeed) => {
      db.Vacation
        .create(item)
        .then(dbModel => {
          db.User.findOneAndUpdate({ email: item.email }, { $push: { vacations: dbModel._id } }, { new: true }).then(data => {
            if (idx + 1 === vacaSeed.length) {
              mongoose.connection.close()
            }
          })
        })
    })
  }).catch(err => {
    console.log(err)
    process.exit(1)
  });

推荐阅读