5

私はおそらく1日くらいSailsをいじっています。私は、Sails.js で広範な検証を行うための最良の方法について頭を悩ませようとしています。

シナリオは次のとおりです。

Registration Form:

Username: _______________
E-Mail:   _______________
Password: _______________
Confirm:  _______________

ユーザー入力:

  • 正しいメール
  • すでに存在するユーザー名
  • 一致しない 2 つのパスワード

望ましい結果:

Username: _______________ x Already taken
E-Mail:   _______________ ✓
Password: _______________ ✓
Confirm:  _______________ x Does not match

要件、いくつかの重要なポイント:

  • ユーザーは、入力のあらゆる側面について(最初のメッセージだけでなく)すべてのエラー メッセージを受け取ります。それらはあいまいではありません(「ユーザー名は既に使用されています」または「ユーザー名は少なくとも 4 文字の長さでなければなりません」は「無効なユーザー名」よりも優れています)。
  • 組み込みモデルの検証は、一致したパスワードの確認 (SRP) を確認する責任を負わないことは明らかです。

私がする必要があると思うこと:

ユーザーコントローラー:

create: function(req, res) {
    try {
        // use a UserManager-Service to keep the controller nice and thin
        UserManager.create(req.params.all(), function(user) {
            res.send(user.toJSON());
        });
    }
    catch (e) {
        res.send(e);
    }
}

ユーザーマネージャー:

create: function(input, cb) {
    UserValidator.validate(input); // this can throw a ValidationException which will then be handled by the controller
    User.create(input, cb); // this line should only be reached if the UserValidator did not throw an exception
}

ユーザー: (モデル)

attributes: {
    username: {
        type: 'string',
        required: true,
        minLength: 3,
        unique: true
    },

    email: {
        type: 'email',
        required: true,
        unique: true
    },

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

ユーザーバリデーター:

これはトリッキーな部分です。入力固有の検証 (パスワードの確認は一致するか?) とモデルの検証 (ユーザー名が取得され、電子メール アドレスは有効か?) を組み合わせる必要があります。

ユーザーモデルをインスタンス化し、Sails/Waterline のデータベースに保存せずに検証を実行する方法があれば、これは非常に簡単だと思いますが、そのオプションはないようです。

この問題をどのように解決しますか?ご助力ありがとうございます!

4

2 に答える 2

8

モデルでこれを行うことができます:

module.exports = {
types: {
    mycustomtype: function (password) {
        return password === this.confirm;
    }
},
attributes: {,
    password:{
        type: 'STRING',
        required: true,
        mycustomtype: true
    }
}
}
于 2014-03-05T20:20:49.917 に答える
3

サーバーへのラウンドトリップを必要とせずに、クライアント側ですぐに実行できる検証がいくつかあります。パスワードを確認パスワードと比較したり、文字列が電子メールの正規表現と一致することを確認したりすることは、クライアント側の JavaScript で行うことができます。

ユーザー名が存在するかどうかを確認するなどの他のことについては、セイルへの ajax 呼び出しを使用して「このユーザー名が存在しますか」と直接尋ね、結果に基づいてクライアント側でリアルタイムの検証を提供するか、待つことができますユーザーがフォームを送信し、フォーム送信を解析してそれらの検証を表示するまで。このようなことを事前にチェックすることは 100% 信頼できるわけではないため (つまり、チェックの後、フォームが返送される前に、誰かがその名前でユーザーを作成することができます)、一部の人々は事前チェックを放棄して処理のみを選択します。投稿後のエラー。

Waterline には、 Anchorと呼ばれる独自の組み込み検証メカニズムがあり、 validator.js (以前は node-validator と呼ばれていました) に基づいて構築されています。利用可能な検証の完全なリストについては、こちらを参照してください。別の検証レイヤーを定義する代わりに、sails 検証メッセージを解析し、ユーザーフレンドリーで一貫性のある方法でフォーマットするメソッドを定義することをお勧めします。

Waterline が行うこと以外で独自の検証を実行したい場合は、ライフサイクル コールバックなどのライフサイクル コールバック内でそれらの検証を行うことができますbeforeCreate(values, callback)。エラーを検出した場合は、最初のパラメーターとしてコールバックに渡すことができ、コレクション作成メソッドの呼び出し元にエラーとして返されます。

ライフサイクル コールバックを使用する代わりに、作成を処理する独自のコレクション メソッドを作成することもできます。このようなもの:

Users.validateAndCreate(req.params.all(), function (err, user) {
    ...
});

このようなコレクション メソッドを作成する方法の詳細については、次の質問に対する私の回答を参照してください: How can I write Sails function on to use in Controller?

于 2014-02-24T19:34:26.223 に答える