在我的意思是js app我有一个帐户模型和相应的路由和控制器。要删除特定帐户,我需要获得授权,我需要登录。
但是,所有用户都可以列出所有帐户,我只会列出特定用户创建的帐户。所以我需要将自动化添加到代码的列表部分。
我使用app.route('/accounts')
和users.requiresLogin
更新accounts.hasAuthorization
的路线,如下所示:
module.exports = function(app) {
var users = require('../../app/controllers/users.server.controller');
var accounts = require('../../app/controllers/accounts.server.controller');
// Accounts Routes
app.route('/accounts')
.get(users.requiresLogin,accounts.hasAuthorization,accounts.list)
.post(users.requiresLogin, accounts.create);
app.route('/accounts/:accountId')
.get(users.requiresLogin, accounts.hasAuthorization,accounts.read)
.put(users.requiresLogin, accounts.hasAuthorization, accounts.update)
.delete(users.requiresLogin, accounts.hasAuthorization, accounts.delete);
// Finish by binding the Account middleware
app.param('accountId', accounts.accountByID);
};
现在我得到一个错误,因为没有为用户提供req。
获取/modules/accounts/views/list-accounts.client.view.html 304 8.266 ms - - TypeError:无法读取属性' user'未定义的 at exports.hasAuthorization(/Users/david/Repositories/budget/app/controllers/accounts.server.controller.js:103:17)
所以我想我需要以某种方式更新accounts.server.controller。删除帐户确实在req中提供了一个帐户,因此只有创建者才能删除,如前所述。如何更新代码以便"帐户列表"部分工作并仅列出属于该特定用户的帐户?
/**
* Delete an Account
*/
exports.delete = function(req, res) {
var account = req.account ;
account.remove(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.jsonp(account);
}
});
};
/**
* List of Accounts
*/
exports.list = function(req, res) {
Account.find().sort('-created').populate('user', 'displayName').exec(function(err, accounts) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.jsonp(accounts);
}
});
};
/**
* Account middleware
*/
exports.accountByID = function(req, res, next, id) {
Account.findById(id).populate('user', 'displayName').exec(function(err, account) {
if (err) return next(err);
if (! account) return next(new Error('Failed to load Account ' + id));
req.account = account ;
next();
});
};
/**
* Account authorization middleware
*/
exports.hasAuthorization = function(req, res, next) {
if (req.account.user.id !== req.user.id) {
return res.status(403).send('User is not authorized');
}
next();
};
帐户客户端服务仅包含基本内容:
//Accounts service used to communicate Accounts REST endpoints
angular.module('accounts').factory('Accounts', ['$resource',
function($resource) {
return $resource('accounts/:accountId', { accountId: '@_id'
}, {
update: {
method: 'PUT'
}
});
}
]);
控制器中未提及用户对象。
答案 0 :(得分:1)
accounts.hasAuthorization假设它在您的当前配置req.account上的accounts.accountById之后执行将是未定义的。
我想知道你的帐户模型中的某个地方:
user: {
type: Schema.ObjectId,
ref: 'User'
}
如果您希望用户只能访问他/她拥有的帐户:
将accounts.list路由更改为仅需要登录,这样我们就可以访问req.user:
app.route('/accounts')
.get(users.requiresLogin,accounts.list)
更改帐户控制器中的exports.list:
exports.list = function(req, res) {
Account.find({user: req.user._id}).sort('-created')
.... //
};