自定义构造函数Mongoose

时间:2016-03-07 00:36:40

标签: javascript node.js mongoose

我开始学习一些关于NodeJS的教程和一些书籍,并开始使用Mongoose和Rest API请求来测试内容。

我遇到的问题与构造函数的创建有关,该构造函数将获取参数(requestBody),然后在模块上实现整个绑定(在我的案例user.js上)。这是为了使代码更可重用,用户模块处理绑定而不是服务器模块,这将大大增加源代码。

实施例

下面的代码正常工作,但效率不高

var express = require('express')
    , bodyParser = require('body-parser')
    , expressValidator = require('express-validator')
    , mongoose = require('mongoose');

var router = express.Router();

router.route('/users')
    // Create a user (accessed at POST http://localhost:8080/api/users)
    .post(function (req, res) {
        // Bind user (repeating the same procedure for every User object)
        var user = new User();
        user.info.name = req.info.name;
        user.info.surname = req.info.name;
        .... // around 10 other properties
        req.info.birthday = req.info.name;

        // Save
        user.save(function (err) {
            .... // Handling completion
        });
    }) 

我的方法

// app/models/user.js

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var userSchema = new Schema({
    info: {
        name: {type: String, required: true},
        surname: {type: String, required: true},
        ......
        birthday: {type: String, required: true}, // dd/mm/yyyy
    },
    likes: [Schema.Types.ObjectId],
    dislikes: [Schema.Types.ObjectId]
});

function initUser(model) {
    userSchema.info.name = model.info.name;
    userSchema.info.surname = model.info.surname;
    ......
    userSchema.info.birthday = model.info.birthday;
    userSchema.likes = model.likes;
    userSchema.dislikes = model.dislikes;
}

module.exports = mongoose.model('User', userSchema);
module.exports.initUser = initUser;

基于此代码,我可以轻松使用请求(Javascript初学者,所以解释会很棒)

var user = new User();
user.initUser(req);

但是我想出了一个非常长的错误,导致服务器崩溃并且最干净的消息是:

  

TypeError:将循环结构转换为JSON

问题

有没有人解决了这个问题?我也看了Mongoose site,但似乎没有这样的具体事情。

1 个答案:

答案 0 :(得分:1)

我不确定您的循环json问题,但您最初的问题是您根据请求阅读模型属性的方式。

如果将值发布到该端点,则您要查找的json值将位于请求的body属性上。通过你的功能:

user.initUser(req.body)

您需要在express中安装一个正文解析器才能正确处理该值。一旦你完成了并传递了request.body,你的方法就可以了。

专业提示:不要单独映射属性。如果键被正确命名,只需使用它们直接构建模型。