2017-09-29 4 views
0

私は帆jsでCRUDアプリケーションを作成しようとしています、私は気づいた私のDBにデータを投稿することができます。しかし、我々がそれに応じて特定のフィールドを望んでいない場合、どのように制限することができます。ありがとうございました。帆jsパスワードと電子メールを返すべきではありません

module.exports = { 
attributes : { 
    username : { 
     type: 'string', 
     required: true 
    }, 
    password : { 
     type: 'string', 
     required: true 
    }, 
    email : { 
     type: 'string', 
     required: true, 
     unique: true 
    } 
}, 
toJson: function() { 
    var obj = this.toObject(); 
    delete obj.password; 
    return obj; 
}, 

beforeCreate: function(attribute, callback) { 
    console.log(attribute.password); 
    require('bcrypt').hash(attribute.password, 10, function(err, encryptedPassword) { 
     sails.log(err); 
     attribute.password = encryptedPassword; 
     sails.log(encryptedPassword); 
     callback(); 
    }); 
} 
    }; 

答えて

1

@arbuthnottは、上記の一部は正しいです - あなたはtoJSONではなくtoJsonが必要です - しかし、それはインスタンスメソッドであるため、より重要なのは、この関数は、attributes辞書内に行く必要があります。

attributes : { 
    username : { 
     type: 'string', 
     required: true 
    }, 
    password : { 
     type: 'string', 
     required: true 
    }, 
    email : { 
     type: 'string', 
     required: true, 
     unique: true 
    }, 
    toJSON: function() { 
     var obj = this.toObject(); 
     delete obj.password; 
     return obj; 
    } 
} 
+0

ありがとうsgress454、チャームのように動作します。 –

1

は私がモデルのための帆のデフォルトのREST APIを介して応答が戻る前に、.toJSONを介してそれらを実行していると思うので、あなたは、この正しい方法を行っています。

.toJSON.toJsonの代わりに大文字で定義する必要があります。そのスイッチを作って問題が解決するかどうか確認してください。これはあなたの問題を解決していないよう


UPDATE

が鳴ります。 hereから帆のドキュメントは言う:

toJSONの本当の力がres.jsonを介して送信されるすべてのモデルのインスタンスは、最初のtoJSONを通過するという事実に依存しています。特定のモデルを使用するすべてのコントローラアクション(カスタムデザイン図を含む)にカスタムコードを書く代わりに、モデルのデフォルトのtoJSON関数を単にオーバーライドするだけで、発信レコードを操作できます。これを使用して、電子メールアドレスやパスワードなどのプライベートデータをすべてのクライアントに送り返すことができます。

これはかなり明確に私たちがやろうとしているかのように聞こえるので、多分これは、帆のバグです。おそらくfindに適用されますが、createには適用されません。既存のユーザーを見つけるだけでそのパスワードが返されますか?

あなたがしなければならない場合は、これを回避する確実な方法は、デフォルトでは、あなたのUserControllerででアクションを作成上書きするようになります:

create: function(req, res) { 
    User.create(req.body).exec(function(err, user) { 
     if (err) { 
      return res.json(err); 
     } 
     // explicitly call your own toJSON() to be sure 
     return res.send(user.toJSON()); 
    }); 
}, 

これは、あなたがで非表示にする多くのモデルの性質を持っている場合は特に、理想的ではありません多くのAPI呼び出し。しかし、それは仕事を完了させるでしょう。

+0

返信arbuthnottのためのThanxですが、大文字に変更しても動作しません。 –

+0

は更新情報を投稿しました。なぜケーシングがそれを解決しなかったのか分かりません。がんばろう。 – arbuthnott

0
password: { type: 'string', required: true, protected: true } 

これも可能です。

関連する問題