如何使用mongoose和node.js在多个mongodb集合中插入数据

时间:2019-06-27 11:06:45

标签: node.js mongodb mongoose

我是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);
    });

});

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

[{     “ companyname”:“堆栈”,     “创始人”:“ alex”,     “联系人”:“ 1234567890”,     “位置”:“中” },     {         “ branchname”:“ am”,         “ branchmanager”:“ abc”,         “联系人”:“ 8754216523”,         “ location”:“客栈”     },     {         “用户名”:“ xyz”,         “ userrole”:“ admin”,         “年龄”:“ 23” }]

enter image description here

1 个答案:

答案 0 :(得分:0)

这里有三个问题:

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

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);
    }
});