【问题标题】:Data insertion to mongodb with mongoose and angular使用 mongoose 和 angular 向 mongodb 插入数据
【发布时间】:2016-04-01 02:09:00
【问题描述】:

我是 nodejs 的新手,并深入研究了将 mongoose 用于 mongodb。让我向您展示我知道我在某处犯了错误的代码结构。假设从角度使用$http.post 我正在发送一个要插入到数据库中的对象。我尝试将数据插入数据库的方式似乎不起作用。

Mongoose Schema Contacts.js

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/contactlist');

    var ContactSchema = new mongoose.Schema({
        name: String,
        email : String,
        number : String
    }, {collection:'contactlist'});

    var ContactModel = mongoose.model('ContactList', ContactSchema);

    module.exports = ContactModel; 

Node server.js

    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');

    app.use(bodyParser.json());
    var db = require('./model/Contacts.js');
    var contact = new db();

    require('./routes/routes.js')(app, db, contact);

Node routes.js

    module.exports = function(app, db, contact){


        // post api

        app.post('/contacts', function(req,res){

            var body = req.body;

            contact.save(body, function(err, data){
                res.json(data);
            });

        });

    };

我在某个地方搞砸了,特别是使用new db() 将数据插入数据库并将其传递给routes 文件。我不确定我在这里缺少什么。插入解决后如何改进这些脚本?

【问题讨论】:

  • 由于你没有在 routes.js 中使用 db 或 contact vars,你可以省略它们。如果你使用 req.body 那么你应该使用 bodyParser 中间件。
  • 我正在使用 bodyParser 中间件。我只是没有在代码中显示。我在 routes.js 中使用 db 和联系变量。我正在通过函数传递它。我正在使用 db 获取数据。但我就是无法插入数据。
  • 不详细讨论问题,我没有看到您的应用正在侦听传入请求,app.listen
  • @Srle 是的。我没有把所有常见的代码都放在代码中。只是我遇到困难的部分。
  • @nickB 所以还有什么问题吗?您有时间尝试任何建议的解决方案吗?

标签: angularjs node.js mongoose mean-stack


【解决方案1】:

试试这个

Mongoose Schema Contacts.js

var mongoose = require('mongoose');
var ContactSchema = new mongoose.Schema({
    name: String,
    email : String,
    number : String
}, {collection:'contactlist'});

var ContactModel = mongoose.model('ContactList', ContactSchema);

module.exports = ContactModel;

节点服务器.js

var express = require('express');
var app = express();
var mongoose = require('mongoose');
var bodyParser = require('body-parser');

app.use(bodyParser.json());
var contacts = require('./model/Contacts.js');

require('./routes/routes.js')(app);

mongoose.connect('mongodb://localhost/contactlist');

节点路由.js

var contacts = require('./model/Contacts.js');
module.exports = function(app){
    // post api
    app.post('/contacts', function(req,res){

        var body = req.body;

// not sure about contact vs contacts here
        contact.save(body, function(err, data){
            res.json(data);
        });
    });
};

【讨论】:

    【解决方案2】:

    作为server.js 的一部分,您正在创建文档,即猫鼬模型的实例,然后您将该文档传递给routes.js 模块的导出函数。从那里你是 javascript 闭包的“受害者”。 '/contacts' 内部的路由处理程序 contact 将始终是相同的东西(您从 server.js 传递的文档)。

    然后在您的路由处理程序中,您以错误的方式使用 mongoose .save() 方法,提供要保存为第一个参数的数据。
    请阅读:http://mongoosejs.com/docs/api.html#model_Model-save

    现在让我们尝试强制您的示例运行,看看会发生什么,肯定是您不想发生的事情。

    module.exports = function(app, db, contact) {
        app.post('/contacts', function(req,res){    
            contact.name = req.body.name;
            contact.email = req.body.email;
            contact.number = req.body.number;
    
            contact.save(function(err, data){
              res.json(data);
            });
        });
    };
    

    这样,您将始终更新同一个文档,由于答案开头解释的原因,猫鼬集合中具有相同 id 的文档。

    所以你想要做的是每当有 POST 到 '/contacts' 时创建新文档。

    var Contact = require('path to Contact model');
    module.exports = function(app) {
      app.post('/constacts', function (req, res) {
        var contact = new Contact(req.body);
        contact.save(function(err) {
          if(err) {...}
          ...
        });
      });
    };
    

    顺便说一句,将mongoose.connection 逻辑从您的模型中移出,这需要成为引导应用程序逻辑的一部分,而db 可能是用于您使用它的目的的糟糕名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2017-12-22
      • 2018-08-20
      • 2016-01-21
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多