9

私はNodeを学び、機能を持たせようとしています:

this.logMeIn = function(username,stream) {
  if (username === null || username.length() < 1) {
    stream.write("Invalid username, please try again:\n\r");
    return false;
  } else {
  ....etc

そして私はそれを渡しています

if (!client.loggedIn) {
  if (client.logMeIn(String(data.match(/\S+/)),stream)) {

== と === の両方を試しましたが、ユーザー名が null であることを検出せず、username.length() が失敗するため、まだエラーが発生します。

if (username === null || username.length() < 1) {
                                  ^
TypeError: Property 'length' of object null is not a function

Node は || の 2 番目の部分を評価しないと確信しています。最初の部分が true の場合の if ステートメントで - しかし、ユーザー名が null オブジェクトの場合に if ステートメントの最初の部分が false と評価される理由を理解できません。誰かが私が間違ったことを理解するのを手伝ってくれますか?

4

4 に答える 4

11

length関数ではなく属性です。試すusername.length

于 2012-05-17T12:29:01.823 に答える
7

引数String(data.match(/\S+/))として渡しているので、 isの場合、次のようにforではありません。usernamedata.match(/\S+/)null"null"nullusername

String(null) === "null"

したがって、条件を変更する必要があります。

if( username === null || username === "null" || username.length < 1 )
于 2012-05-17T12:39:27.963 に答える
1

試す

if( ユーザー名 === null || ユーザー名.toString().length < 1 )

if( username === null || username.length < 1 ) を使用しましたが、長さチェックに失敗しました。

于 2016-06-16T04:12:11.910 に答える
1

空でない文字列が必要な場合はnullundefined''、 などで機能する単純な「真実」チェックを実行できます。

if (username) { ... }

.lengthそのアプローチでは、チェックさえ必要ありません。また、lengthメソッドではなくプロパティです。


編集:ファンキーさが進行中です。ユーザー名をどのように渡すかから始める必要があると思います-String(data.match(/\S+/))ロジックが期待どおりに動作しているとは思いません(これを見つけた@Engineerの功績による)。

一致式は、1 つまたは 2 つのタイプの値を返します:nullまたはArray. @Engineerが指摘したように、nullの場合"null"、文字列として渡すことになり、結果として後でユーザー名チェックに合格するはずです。これを次のように修正することを検討する必要があります。

if (!client.loggedIn) {
    var matches = data.match(/\S+/);
    if (client.logMeIn(matches ? matches[0] : '',stream)) {

.lengthすべての場合に等しいということについて1は、正直あまり意味がありません。console.log()何が起こっているのかを理解するために、多くのステートメントを追加することをお勧めします。

于 2012-05-17T12:29:08.283 に答える