自定义构造函数猫鼬

Custom constructor Mongoose

本文关键字:构造函数 自定义      更新时间:2023-09-26

我开始学习一些关于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);

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

类型错误:将循环结构转换为 JSON

问题

有没有人解决这个问题?我也看了一下猫鼬网站,但似乎没有这样具体的东西。

我不确定您的循环 json 问题,但您的初始问题是您从请求中读取模型属性的方式。

如果将值发布到该终结点,则要查找的 json 值将位于请求的 body 属性上。将函数传递给以下内容:

user.initUser(req.body)

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

专业提示:不要费心单独映射属性。如果键的名称正确,只需使用它们直接构造模型即可。