【问题标题】:Can't insert into MongoDB with Mongoose无法使用 Mongoose 插入 MongoDB
【发布时间】:2017-12-22 08:10:19
【问题描述】:

我正在尝试使用MongooseMongoDB 中插入一个对象,但没有成功。 在 './models/user,js' 我有:

var mongoDatabase = require('./db'); //I've connected to localhost here
var database = mongoDatabase.getDb();
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
  user: String,
  adress: String,
});

userSchema.methods.testmethod = function(){
  console.log('test');
}
userSchema.methods.insert = function (obj) { //this works but what is the point to use Mongoose If I do it that way
  database.collection("users").insertOne(obj, function(err, res) {
        if(err) throw err;
        console.log("1 record inserted");
    });
}
var User = mongoose.model('User', userSchema);
module.exports = User;

在'./controllers/user.js'中

var express = require('express');
var router  = express.Router();
var User    = require('../models/user');

router.post("/", function(request, response) {  
    var obj = new User({
        user: request.body.name,
        adress: request.body.adress,
    });

    obj.testmethod(); //works fine
    obj.insert(obj); //throws an error

    User.insertOne(obj, function(err, res) { //error: insertOne is not a function
        if(err) throw err;
        console.log("1 record inserted");
    }); 
});
module.exports = router;

我尝试了其他几种方法来做到这一点,但没有结果。有人可以帮我吗?

【问题讨论】:

  • 你试过只打电话给obj.save(function(err,res) {

标签: node.js mongodb mongoose


【解决方案1】:

您不应该使用您在 './db' 中创建的任何 mongodb 对象来完成这项工作,mongoose 会为您处理。尝试简化为:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
  user: String,
  adress: String,
});
module.exports = mongoose.model('User', userSchema);

然后在你的控制器代码中

var express = require('express');
var router  = express.Router();
var User    = require('../models/user');

router.post("/", function(request, response, next) {  
    var user = new User({
        user: request.body.name,
        adress: request.body.adress,
    });

    user.save(function(err, u) {
        if (err) return next(err);
        return res.json(u);
    });
});
module.exports = router;

在您的应用启动代码中的某个位置(通常在 app.js 或类似位置),您需要调用 mongoose.connect(<connection url>),通常是在设置路由之前。

请注意,您也可以显式调用insert(),但它是模型对象上的静态方法,如下所示:

User.insert({user: 'bob', address: 'somewhere, nh'}, cb)

【讨论】:

  • 谢谢!我想知道的最后一件事是return next(err) 而不是throw err
  • 如果您使用异步代码,通过回调处理错误总是合适的(例如错误优先回调方法或通过侦听错误事件)。除非您使用的是最新版本的 Node.js 中新增的 async/await 内容,否则在您的应用程序的其他地方将无法捕获该错误。 next(err) 是从路由内部传递错误的 Express 标准方式,然后您将安装一个错误处理中间件,以一种常见且集中的方式处理您弹出的错误。示例:expressjs.com/en/guide/error-handling.html
猜你喜欢
  • 2012-02-07
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2016-09-19
  • 2017-03-12
  • 2016-04-01
相关资源
最近更新 更多