2016-11-10 7 views
0

私はsails.jsを初めて使用しましたが、いくつかの作業の後にはbeforeValidate()が使いにくいと感じています。sails.jsのbeforeValidate()のロジック

私はモデルUserの2つの属性nicknameageしか持っていません。 両方の属性はrequiredとマークされているので、セイルは検証をチェックします。 ユーザーを作成する場合、クライアントはそのニックネームを指定しない場合、私は次のように、そこにランダムなニックネームを割り当てたい:

beforeValidate: function(user, next){ 
    if (!user.nickname) user.nickname = randomString(5); 
    next(); 
} 

帆がnicknamerequiredタグを検証する前にこの割り当てが適用されるべきです、したがって、beforeValidate()はそれを実行する唯一の合理的な場所のようです。また、悲しいことに、beforeValidate()の引き金となります

User.update(user.id, {age: 40}); 

beforeValidate()におけるパラメータuserは今{age: 40}であることから、新しいニックネームは、割り当てられ、元の1を交換されます。私は次のようにユーザの年齢を更新したいときしかし、 。

beforeValidate(user, callback)は、指定した変更された属性だけでなく、変更された属性と変更されていない属性の両方の組み合わせ(古いID、古いニックネーム、新しい年齢のユーザーなど)を更新する必要があります。 User.update()(例えば、{age: 40}のみ)。

私は何かを誤解していますか?

+0

I 'defaultTo'が関数であることがわかるので、私の目的を満たすことができますしかし、。しかし、私はまだ 'beforeValidate()'の 'user'パラメータが完全なユーザレコードではないことを知りたいと思います。 –

答えて

0

create()を呼び出している間に、新しいレコードを追加するのに必要なすべての値がbeforeValidateに渡されます。 update()を呼び出している間は、更新されている値のみがbeforeValidateに渡されます。これがuser.nicknameを空の値にしている理由です。

http://sailsjs.org/documentation/concepts/models-and-orm/lifecycle-callbacksのドキュメントを参照してください。

beforeValidate作成に

コールバック:更新にFN(値、CB)

コールバックを

beforeValidate:FN(valuesToUpdate、CB)