7

モデル フックからリクエストを発行したユーザーの詳細にアクセスするにはどうすればよいですか

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

これを行う方法はありますか?途中でメインアイテムのリモートフックでやってみた

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();

});

そして、エクスプローラーからリクエストすると、コンソールログを適切に取得しますが、エクスプローラーは常にエラーを返します

"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   "
  }
}

私のモデルは

 "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
}

}

4

5 に答える 5

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();
于 2014-11-20T08:36:40.490 に答える
2

beforeRemote フックはモデル フックの前に実行されるため、userId をリクエスト本文に追加できます。

Comment.beforeRemote('**', function (ctx, unused, next) {
    var userId = ctx.req.accessToken.userId;
    if (ctx.methodString == 'Comment.create' || ctx.methodString == 'Comment.updateAttributes') {
        ctx.req.body.userId = userId;
    }
    next();
});

どのメソッド文字列が自分に最も適しているかを確認することをお勧めします。

于 2014-11-14T13:37:26.337 に答える
1

本文解析用のミドルウェアを追加することでこれを解決しました。middleware.js で、次のコードを書きました。

...
"parse": {
   "body-parser#json": {},
   "body-parser#urlencoded": {"params": { "extended": true }}
},
...

また、server.js に body パーサーと multer の require を追加しました。

var loopback = require('loopback');
...
var bodyParser = require('body-parser');
var multer = require('multer');
...

app.use(bodyParser.json()); // application/json
app.use(bodyParser.urlencoded({ extended: true })); // application/x-www-form-urlencoded
app.use(multer()); // multipart/form-data
...

次に、package.json に依存関係を追加します。

"body-parser": "^1.12.4",
"multer": "^0.1.8"

/models/user.js で次のようなことができるようになりました (任意のモデルに対して)

  user.beforeRemote('create', function(ctx, unused, next) {
     console.log("The registered user is: " + ctx.req.body.email);
     next();
  });

これが役立つことを願っています!:)

于 2015-06-10T15:14:47.130 に答える
0

User -> Commentというリレーションコメントがあると仮定するとPOST /users/{user_id}/comments、foreignId (add_by の場合もあります) を入力するリレーション メソッドを試すこともできます。

もう一つはadded_atです。私が理解している限り、フックを作成する前に検証フックがトリガーされます。このフィールドはモデルで必須としてマークされているため、検証が失敗することを意味します。問題は、このフィールドがサーバーによって設定され、API のクライアントによって設定される必要がないため、このフィールドを必須としてマークする必要があるかどうかです。

于 2014-11-19T23:25:04.457 に答える