2016-10-03 76 views
2

我想扩展一个模块(或创建自己的)以将用户自动添加到撇号(aposUsersSafe集合)。自动将用户添加到撇号

我在撇号用户模块中没有看到任何内置方法来做到这一点,并且正在寻找一些关于如何实现它的指导?谢谢!

回答

2

正如前面提到的,我是P'unk大道撇号的首席设计师。

aposUsersSafe集合仅用于存储密码散列和一些非常规相关属性的非规范化副本。您通常不需要直接与它进行交互。像撇号中的所有其他文档一样,用户生活在aposDocs集合中。最好通过管理该类型块的模块提供的方法与它们进行交互。在这种情况下,这将是apos.usersapostrophe-users模块)。

查看此方法;这是从addFromTask方法apostrophe-users轻微重构,它实现了添加一个用户,并将它们添加到一个组,你几乎肯定也会这样做。

这里没有代码来散列密码,因为apos.usersinsert方法会为我们做。

self.addUser = function(req, username, password, groupname, callback) { 
    // find the group 
    return self.apos.groups.find(req, { title: groupname }).permission(false).toObject(function(err, group) { 
    if (err) { 
     return callback(err); 
    } 
    if (!group) { 
     return callback('That group does not exist.'); 
    } 
    return self.apos.users.insert(req, { 
     username: username, 
     password: password, 
     title: username, 
     firstName: username, 
     groupIds: [ group._id ] 
    }, { permissions: false }, callback); 
    }); 
}; 

permission(false)被称为光标和选项与{ permissions: false }传给插入,因为我假设你希望它在这一点发生,无论谁触发它的对象。

我建议reading this tutorial on Apostrophe's model layer为如何与Apostrophe的内容类型合作打下坚实的基础,而不会陷入困境。你可以直接使用MongoDB,但是你必须知道什么时候该做什么,什么时候不需要。

插入用户时可以传递更多属性;这只是合理行为的最低限度。

至于调用该方法,如果你把它在项目层面增加lib/modules/apostrophe-users/index.jsconstruct,那么你可能会从中间件这样称呼它:

return self.apos.users.addUser(req, username, password, groupname, function(err, newUser) { 
    if (err) { 
    // Handle the error as you see fit, one way is a 403 forbidden response 
    res.statusCode = 403; 
    return res.send('forbidden'); 
    } 
    // newUser is the new user. You could log them in and redirect, 
    // with code I gave you elsewhere, or continue request: 
    return next(); 
}); 

希望这是有帮助的!

+0

谢谢。这绝对有帮助。如果我理解你的建议,我会添加self.AddUser来构建我的lib \ modules \撇号用户模块。然后,我想从我在我的撇号快速模块中执行的检查中调用此方法: '中间件:[ 函数(req,res,next){0}从cookie if(email && auth){ //我如何在这里调用addUser? //apostrophe-users.addUser(req,email,'','admin',null) } }' 不知道如何调用? –

+0

查看您在自动登录用户(demo-autologin模块)中提供的其他答案,可以使用self.pageBeforeSend方法。我以为这只会在匹配的路由上执行,但看起来这是由于在app.js中定义的模块而在每个请求上执行的。从我的理解,这self.pageBeforeSend方法可以用来执行任何代码我想要在任何页面请求 - 有权访问请求和对象。如果这不是在每个请求上执行代码的方式,您能指出我更好的方法吗? –

+0

如果您按照您的建议将此方法添加到撇号users/index.js中,那么您将从另一个模块的中间件函数中调用此方法: return self.apos.users.addUser(req,username,password, groupname,function(err,newUser)if(err){//处理错误,你认为合适,一种方式是403禁止响应 res.statusCode = 403; return res.send('forbidden') ; } // newUser是新用户,您可以登录他们并重定向, //带我在其他地方给出的代码,或继续请求: return next(); }); –