2017-07-17 85 views
0

我試圖在MongoDB中插入一個對象Mongoose,但沒有成功。 在 './models/user,js'我有:無法用Mongoose插入到MongoDB中

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; 

我已經嘗試了一些更多的方式來做到這一點,但沒有結果。有人能幫我嗎?

+0

您是否嘗試過只是調用'obj.save(函數(ERR,RES){ ' –

回答

1

你不應該使用'./db'中創建的任何mongodb對象來完成這項工作,貓鼬會爲你處理它。儘量簡化到這一點:

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)

+0

謝謝!最後我想知道的是'下一個(err)'而不是'throw err'是什麼? –

+0

如果你在異步代碼中,通過回調來處理錯誤總是合適的例如,錯誤優先回調方法或通過監聽錯誤事件)拋出錯誤將不會在您的應用中的其他地方捕獲,除非您使用async/await對最新版本的節點。 next(err)是從路由中傳遞錯誤的Express標準方式,然後您將安裝一個錯誤處理中間件來處理以公共和集中方式彈出的錯誤。例如:http://expressjs.com/en/guide/error-handling.html – Paul

相關問題