2015-03-08 47 views
0

簡介MEAN.JS貓鼬填充在中間件不起作用

我使用MeanJS,對於Web應用程序從用戶列表中的文章全面的網絡堆棧的解決方案。這與MEAN.JS默認提供的示例非常相似。

問題

當我打電話的文章http://localhost:3000/articles名單,結果集與每一篇文章(通過貓鼬填充功能)相關聯的用戶的電子郵件和用戶名。但是當我檢索一篇文章http://localhost:3000/articles/1234567890時,用戶信息與文章沒有關聯。

我試圖使用mongoose-relationsip插件,並將toObject: { virtuals: true }, toJSON: { virtuals: true }添加到文章模型。兩者都不起作用。

有關更多詳細信息,我已將控制器,路由器和文章對象的模型相關聯。

模型

爲了簡單起見,我只包括每個對象的必要屬性。基本上,我有一個文章對象和一個用戶對象(順便說一句:我使用MEAN.JS提供的相同示例)。

articles.server.model.js 'use strict';

/** 
* 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(); 
    }); 
}; 

任何幫助將是非常讚賞。

謝謝。

+0

不知道,試試這個'Article.findById(id).populate('user','displayName')。populate('email')。exec(...' – Hareesh 2015-03-09 17:37:24

回答

0

看起來您的文章中間件不會將該文章添加到req。調用next()前加入這一行:

req.article = article; 
+0

它不起作用,似乎req .article不能在中間件上被覆蓋,或者可能在下一個()之後被實際覆蓋。 – protactinium 2015-03-08 22:51:56

0

在這一部分,你是不是分配結果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); 
}; 
回吧