【问题标题】:MEAN.JS Mongoose Populate in middleware does not work中间件中的 MEAN.JS Mongoose 填充不起作用
【发布时间】:2015-05-09 22:17:36
【问题描述】:

简介

我正在使用MeanJS 作为一个完整的 Web 堆栈解决方案,供 Web 应用程序列出来自用户的文章。与 MEAN.JS 默认提供的示例非常相似。

问题

当我调用文章列表http://localhost:3000/articles 时,结果集具有与每篇文章关联的用户电子邮件和用户名(通过 Mongoose 填充函数)。但是当我检索到单个文章http://localhost:3000/articles/1234567890时,用户信息并没有与文章关联。

我尝试使用mongoose-relationsip插件,并在文章模型中添加toObject: { virtuals: true }, toJSON: { virtuals: true }。两者都没有工作。

更多细节,我已经关联了控制器、路由器和文章对象的模型。

模型

为简单起见,我只包含了每个对象的必要属性。基本上,我有一个文章对象和一个用户对象(顺便说一句:我使用的是 MEAN.JS 提供的相同示例)。

articles.server.model.js '使用严格';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    relationship = require("mongoose-relationship");    

/**
 * Article Schema
 */
var ArticleSchema = new Schema({
    body: {
        type: String,
        default: '',
        trim: true
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User',
        childPath:"articles"
    },
    viewCount: {
        type: Number,
        optional: true,
    },
    comments:[{ 
        type:Schema.ObjectId, 
        ref:"Comment" 
    }],{ 
    strict: true,
    toObject: { virtuals: true },
    toJSON: { virtuals: true }
});    

ArticleSchema.plugin(relationship, { relationshipPathName:'user' });
mongoose.model('Article', ArticleSchema);

articles.server.routes.js

'use strict';

/**
 * Module dependencies.
 */
var users = require('../../app/controllers/users.server.controller'),
    articles = require('../../app/controllers/articles.server.controller');

module.exports = function(app) {
    // Article Routes
    app.route('/articles')
        .get(articles.list)
        .post(users.requiresLogin, articles.create);

    app.route('/articles/:articleId')
        .get(articles.read)
        .put(users.requiresLogin, articles.hasAuthorization, articles.update)
        .delete(users.requiresLogin, articles.hasAuthorization, articles.delete);

    // Finish by binding the article middleware
    app.param('articleId', articles.articleByID);
};

articles.server.controller.js

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    errorHandler = require('./errors.server.controller'),
    Article = mongoose.model('Article'),
    db=require('./databaseoperations'),
    _ = require('lodash');

/**
 * Show the current article
 */
exports.read = function(req, res) {
    res.json(req.article);
};
/**
 * List of Articles
 */
exports.list = function(req, res) {
    Article.find().populate('user', 'displayName email').exec(function(err, articles) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(articles);
        }
    });
};

/**
 * Article middleware
 */
exports.articleByID = function(req, res, next, id) {
    Article.findById(id).populate('user', 'displayName email').exec(function(err, article) {
        if (err) return next(err);
        if (!article) return next(new Error('Failed to load article ' + id));
        next();
    });
};

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 不确定,试试这个Article.findById(id).populate('user', 'displayName').populate('email').exec(...

标签: javascript node.js mongodb mongoose meanjs


【解决方案1】:

您的文章中间件似乎没有将文章添加到 req。在调用next()之前添加这一行:

req.article = article;

【讨论】:

  • 它不起作用。似乎 req.article 无法在中间件上被覆盖,或者它实际上可能在 next() 之后被覆盖。
【解决方案2】:

在这部分中,您没有将结果分配给 req

    exports.articleByID = function(req, res, next, id) {
    Article.findById(id).populate('user', 'displayName email').exec(function(err, article) {
        if (err) return next(err);
        if (!article) return next(new Error('Failed to load article ' + id));
        req.article = article; //THIS PART IS MISSING
        next();
    });
};

所以当你通过id阅读单篇文章时,你从req.article返回

exports.read = function(req, res) {
    res.json(req.article);
};

【讨论】:

    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 2019-06-20
    • 2021-12-20
    • 1970-01-01
    • 2013-12-08
    • 2017-11-12
    • 2019-01-31
    • 2021-12-18
    相关资源
    最近更新 更多