javascript - 试图用 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));
})
},
解决方案
我最终将两个 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)
});
推荐阅读
- c++ - 如何在g ++中抑制使用但从未定义过的内联函数
- javascript - 使用javascript动态创建文本框数组并从php访问文本框名称以将数据传递给mysql
- flutter - 如何使用 Flutter 截屏和分享
- clearcase-ucm - 如何在透明箱中取消交货
- android - Image_picker 抛出 removeInvalidNode jank 列表中的所有节点超时而不是返回图像
- android - Flutter 应用程序签名密钥失败
- flutter - Flutter 中的 SCORM 播放器
- javascript - 如何从切换按钮返回真假
- reactjs - React Redux 减速器
- regex - 正则表达式匹配单词和数字未通过所有测试场景