2

私は最初の Node.js プロジェクトに取り組んでおり、問題に遭遇しました。入力検証にnode-validatorを使用し、ORM としてSequelizeを使用しています。

非同期検証の問題

特定のユーザー名がまだ利用可能かどうかを確認するために、いくつかのカスタム検証を作成しようとしています。唯一の問題は、Sequelize のファインダーが非同期であるのに対し、node-validator には非同期検証のサポートが組み込まれていないことです。

私が試した2つのアプローチ

上記のどちらのアプローチにも満足していません。コールバックを使用するとすぐに面倒になり、Sequelize の組み込みの検証を使用すると他の問題が発生します。

どうやら、Sequelize でファインダーを同期的に使用する方法はないようです。これが私の解決策でした。

今何?

この問題をクリーンな方法で解決するには、どのようなオプションが必要ですか? 理想的には、検証プロセスを次のようにしたいと思います。

req.sanitize('username').trim();
req.check('username', 'Your username must be between 4 and 32 characters long').len(4, 32);
req.check('username', 'That username is already taken').usernameIsAvailable();

非同期検証をきれいに実装するにはどうすればよいですか? ご協力ありがとうございました!

4

1 に答える 1

1

あなたは間違いなく同期ソリューションを見つけるつもりはありません。ノードは非同期と同義です。

私たちのほとんどがコールバック スパゲッティに対処する方法は、1000 npm モジュールで使用される async ライブラリを使用することです。https://github.com/caolan/async#seriesでは、これら 3 つの関数を同期的に実行しているかのように並べることができます。

ただし、この問題に対処する最も慣用的な方法は、Sequelize モデル (既にノード バリデータが含まれています) でユーザー名の要件を指定し、ユーザー名が既に存在する場合に Sequelize エラーをユーザーに報告するコードを記述することです。または無効です。つまり、Sequelize はすでにすべてのノード バリデーター関数への非同期アクセスを提供しているため、何かを事前チェックする理由がよくわかりません。

于 2013-07-28T12:39:41.020 に答える