【问题标题】:how to insert data in multiple mongodb collections using mongoose & node.js如何使用 mongoose 和 node.js 在多个 mongodb 集合中插入数据
【发布时间】:2019-06-27 11:06:45
【问题描述】:

我是 node.js 的新手。我正在尝试使用 node.js 将三个不同的对象存储在 mongodb 的集合中。

index.js

var mongoose = require('mongoose');
var bodyparser = require('body-parser');
var app = express();
var control = require('./controllers/controller');
var port = 3200;

mongoose.connect(
    'mongodb://localhost:27017/create-company',
    {useNewUrlParser: true},
    err => {
        if(err) throw err;
        console.log('connection successfully');
    }
)
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({extended: true}));
app.use('/api', control);

app.listen(port, function(){
    console.log('start your server on: ', port);
});

model.js

var mongoose = require('mongoose');

var CompanySchema = new mongoose.Schema({
    companyname: String,
    founder: String,
    contact: String,
    location: String
});
var company = mongoose.model("company", CompanySchema); 

var BranchSchema = new mongoose.Schema({
    branchname: String,
    branchmanger: String,
    contact: String,
    location: String  
});
var branch = mongoose.model('branch', BranchSchema);

var UserSchema = new mongoose.Schema({[enter image description here][1]
    username: String,
    userrole: String,
    age: Number
});
var user = mongoose.model('user', UserSchema);

module.exports = {
    company: company,
    branch: branch,
    user: user
}

controller.js

var express = require('express');
var router = express.Router();
var company = require('../models/model');

router.post('/create_company', function (req, res) {
    var new_company = new company.company(req.body);
    var new_branch = new company.branch(req.body);
    var new_user = new company.user(req.body);

   new_company.save(function (err, data) {
        if (err) 
        res.send(data);
        console.log(data);
    });

    new_branch.save(function (err, data) {
        if (err) 
        res.send(data);
        console.log(data);
    });


    new_user.save(function (err, data) {
        if (err)
        res.send(data);
        console.log(data);
    });

});

我像这样将数据传递给邮递员:

[{ “公司名称”:“堆栈”, “创始人”:“亚历克斯”, “联系方式”:“1234567890”, “位置”:“在” }, { “分行名称”:“我”, “分公司经理”:“ABC”, “联系方式”:“8754216523”, “位置”:“旅馆” }, { “用户名”:“xyz”, “用户角色”:“管理员”, “年龄”:“23” }]

enter image description here

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    这里有三个问题:

    您正试图通过将整个正文传递给构造函数来创建一个新文档。您需要将正确的数组元素传递给它各自的构造函数。

    var new_company = new company.company(req.body[0]);
    var new_branch = new company.branch(req.body[1]);
    var new_user = new company.user(req.body[2]);
    

    您正尝试多次发送响应。您需要协调回调,以便在它们全部完成后发送响应。我建议你使用 Promise 来完成这个,幸运的是 Mongoose 支持 Promise。

    Promise.all([
        new_company.save(),
        new_branch.save(),
        new_user.save()
    ]).then(function (data) {
        res.send(data);
        console.log(data);
    });
    

    您没有正确处理错误。您的if (err) 语句将导致res.send(data) 在出现错误时被调用,这当然是不希望的。使用上面定义的基于 promise 的方法进行错误处理非常简单。

    Promise.all([
        new_company.save(),
        new_branch.save(),
        new_user.save()
    ]).then(function (data) {
        res.send(data);
        console.log(data);
    }).catch(function (err) {
        res.status(400).send('Uh oh! Something bad happened.');
        console.error(err);
    });
    

    如果你使用 ES6 语法,你可以编写一个看起来同步的路由,如果你来自不同的语言,这可能会更熟悉:

    router.post('/create_company', async (req, res) => {
        try {
            const [company, branch, user] = req.body;
            const data = await Promise.all([
                new company.company(company).save(),
                new company.branch(branch).save(),
                new company.user(user).save()
            ]);
            res.send(data);
        } catch (err) {
            res.status(400).send('Uh oh! Something bad happened.');
            console.error(err);
        }
    });
    

    【讨论】:

    • 谢谢杰克。非常非常有用的内容。再次感谢您花时间阅读我的代码。
    猜你喜欢
    • 2018-03-24
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2012-02-07
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多