Loopback 3.0+MongoDB:无法找到扩展的appUser用户问题求助
在LoopBack 3.0中访问并修改当前登录的appUser
嘿,我来帮你搞定在自定义REST方法里操作当前登录用户的需求!结合你已经扩展了User为appUser且Token关联正确的前提,咱们一步步来:
1. 给自定义方法启用认证并注入当前用户
首先得确保只有登录用户能调用你的自定义方法,同时让LoopBack自动把当前用户实例传递过来。直接看代码示例:
module.exports = function(appUser) { // 定义修改自身信息的自定义方法 appUser.updateOwnProfile = async function(currentUser, updateData, cb) { try { // 把要更新的字段合并到当前用户实例 Object.assign(currentUser, updateData); // 保存修改到MongoDB const updatedUser = await currentUser.save(); cb(null, updatedUser); } catch (err) { cb(err); } }; // 配置远程方法的元数据 appUser.remoteMethod('updateOwnProfile', { accepts: [ // 自动注入当前登录的appUser实例 {arg: 'currentUser', type: 'appUser', http: {source: 'user'}, required: true}, // 接收前端传来的修改数据 {arg: 'updateData', type: 'object', http: {source: 'body'}, required: true} ], returns: {arg: 'user', type: 'appUser', root: true}, http: {path: '/update-own-profile', verb: 'patch'}, // 启用JWT认证,确保只有登录用户能访问 auth: {strategy: 'jwt'} }); };
2. 手动获取用户的备选方案
如果上面的自动注入没生效(比如配置遗漏),你也可以通过请求里的AccessToken手动查询用户:
appUser.updateOwnProfile = async function(cb) { const accessToken = this.req.accessToken; if (!accessToken) { return cb(new Error('用户未登录,请先登录')); } try { // 通过Token里的userId查询当前appUser const currentUser = await appUser.findById(accessToken.userId); // 直接修改你的自定义字段,比如ge currentUser.ge = '新的地理位置信息'; const updatedUser = await currentUser.save(); cb(null, updatedUser); } catch (err) { cb(err); } };
3. 再确认Token模型的关联配置
你已经修改了Token指向appUser,再检查下AccessToken模型的定义是否正确,确保关联的是你的自定义用户模型:
{ "name": "AccessToken", "base": "AccessToken", "relations": { "user": { "type": "belongsTo", "model": "appUser", "foreignKey": "userId" } } }
4. 测试接口
调用这个接口时,记得在请求头里带上登录时拿到的Token:Authorization: Bearer <你的Token字符串>,然后在请求体里传入要修改的字段(比如{"ge": "上海浦东新区"}),就能成功修改当前登录用户的信息啦!
内容的提问来源于stack exchange,提问作者Tu.Ma.
相关产品推荐
相关产品推荐

