来自beforeSave Model Hook的访问请求标头

Jib*_*hew 7 strongloop loopbackjs

如何从模型挂钩中访问提出请求的用户的详细信息

Comment.beforeSave =  function(next,com) {
//Want to add 2 more properties before saving 
com.added_at = new Date();    
com.added_by =  //How can i set the user id here ??
//In case of a Remote hook i have ctx in param and i can get user id like this     ctx.req.accessToken.userId;  But in Model Hook how can i do the same?    
next();    
};
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我尝试使用远程钩子作为主要项目

MainItem.beforeRemote('**', function(ctx, user, next) {   
if(ctx.methodString == 'leave_request.prototype.__create__comments'){       
    ctx.req.body.added_by = ctx.req.accessToken.userId;     
    ctx.req.body.added_at = new Date();                         
    console.log("Added headers as .."+ctx.req.body.added_by);
}    
else{   
    ctx.req.body.requested_at = new Date();
    ctx.req.body.requested_by = ctx.req.accessToken.userId; 
    console.log("Added header @ else as .."+ctx.req.body.requested_by);
}
next();
Run Code Online (Sandbox Code Playgroud)

});

一旦我从资源管理器发出请求,我就可以正确获取控制台日志,但是资源管理器总是会向我返回错误

"error": {
    "name": "ValidationError",
    "status": 422,
    "message": "The `comment` instance is not valid. Details: `added_by` can't be blank; `added_at` can't be blank.",
    "statusCode": 422,
    "details": {
      "context": "comment",
      "codes": {
        "added_by": [
          "presence"
        ],
        "added_at": [
          "presence"
        ]
      },
      "messages": {
        "added_by": [
          "can't be blank"
        ],
        "added_at": [
          "can't be blank"
        ]
      }
    },
    "stack": "ValidationError: The `comment` instance is not valid. Details: `added_by` can't be blank; `added_at` can't be blank.\n   "
  }
}
Run Code Online (Sandbox Code Playgroud)

我的模型就像

 "properties": {
"body": {
  "type": "string",
  "required": true
},
"added_by": {
  "type": "number",
  "required": true
},
"added_at": {
  "type": "date",
  "required": true
},
"leave_request_id":{
  "type": "number",
  "required": true
}
Run Code Online (Sandbox Code Playgroud)

}

小智 10

您似乎无法通过简单覆盖来更新相关模型ctx.req.body.而不是你应该覆盖ctx.args.data- 看起来这个ctx参数用于初始化相关模型.

所以看起来像这样:

MainItem.beforeRemote('**', function(ctx, user, next) {   
  if(ctx.methodString == 'leave_request.prototype.__create__comments'){  
     ctx.args.data.added_by = ctx.req.accessToken.userId;     
     ctx.args.data.added_at = new Date();                         
     console.log("Added headers as .."+ctx.args.data.added_by);
  }    
  else{  ... }
  next();
Run Code Online (Sandbox Code Playgroud)