2

モデル内のレコードをチェックするカスタム モデル バリデーターを使用する場合。スプレッド内のリターンは、制御フローを終了していないようです。

//Post.js Model  

  /**
   *  Custom Validator
   **/
  types: {
    isUserValid: function(user_id) {
      var Promise = require('bluebird');

      Promise.all([
        User.findOne({id: user_id})
      ])
        .spread(function(user) {
          console.log(user);
          if (user === null || user === undefined) {
            console.log('failed');
            return false;
          }else{
            console.log('passed');
            return true;
          }
        });
    }
  },

私の応答は、標準の検証失敗応答です。

{
  "error": "E_VALIDATION",
  "status": 400,
  "summary": "1 attribute is invalid",
  "model": "Post",
  "invalidAttributes": {
    "owner": [
      {
        "rule": "isUserValid",
        "message": "\"isUserValid\" validation rule failed for input: 1"
      }
    ]
  }
}
4

1 に答える 1

2

「trueを返し、falseを返す」をisUserValid関数の戻り値にしたいようです。しかし実際には、javascript スコープがどのように機能するかではありません。スプレッド関数内の return ステートメント return true は、promise が「true」で解決されることを意味するだけです。関数として返されません。関数 isUserValid はまだ何も返しません。この関数が async promise である場合。少なくとも約束を返す必要があります。

return Promise.all([....]).spread.....

実際、それは単純化できます

return User.findOne(user_id).then(function(u){....})

ただし、この関数が promise をサポートしていない場合、つまり同期的であり、promise オブジェクトの代わりに true/false が返されることを期待しています。このプロセスを同期にする必要があります。プロミスを同期に変換する 1 つの方法は、ジェネレーター関数を使用することです。こちらをご覧ください

于 2015-06-15T14:43:27.077 に答える