2012-05-17 21 views
5

Estoy tratando de aprender de nodo y tienen la función:longitud de la cadena en el Nodo JS cuando la cadena puede ser nula

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

y estoy pasándolo

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

que he probado == === tanto y, pero todavía estoy recibiendo errores como el nombre de usuario no está detectando que es nula, y username.length() falla en:

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

estoy seguro de que Nodo no evaluará la segunda parte de || en la declaración if cuando la primera parte es verdadera, pero no entiendo por qué la primera parte de la sentencia if se evalúa como falsa cuando username es un objeto nulo. ¿Alguien puede ayudarme a entender lo que he hecho mal?

+0

Eliminar este comentario y añádalo a mi respuesta, y seguiremos chateando en mi respuesta. – Engineer

Respuesta

3

Usted está pasando String(data.match(/\S+/)) como username argumento, por lo que cuando es data.match(/\S+/)null, se obtiene "null" no null para username, como:

String(null) === "null" 

por lo que necesita para cambiar su condición:

if(username === null || username === "null" || username.length < 1) 
+0

Si estaba recibiendo la cadena '" nulo "', entonces no obtendría un error en '" nulo ".length" '- sería 4. – jmar777

+0

@ jmar777 No importa en este caso, ' causa 'username ===" null "' is 'true' en ese caso, y se ejecutará el cuerpo' if'. – Engineer

+0

Derecha, pero el código existente está comparando con 'null', not' "null" '- entonces el error al llamar a '.length' está separado. Eso fue una buena captura en el funky' String (data.match()) '. – jmar777

7

length es un atributo, no una función. Intenta username.length

+0

¡O 'username' no es una cadena entonces o estás haciendo algo mal! – Amberlamps

+0

Estaba equivocado: la longitud está evaluando correctamente la longitud de la cadena pasada. Sin embargo, esto no resuelve el problema original de ¿cómo sé si he pasado un objeto nulo? null.length no evalúa ?! –

1

Si necesita una cadena no vacía, se puede hacer una simple verificación "Truthy" que funcione para null, undefined, '', etc:

if (username) { ... } 

Con ese enfoque, usted don' t incluso necesita el cheque .length. Además, length es una propiedad, no un método.


Editar: Usted tiene algunos funkiness pasando. Creo que debe comenzar con la forma en que está pasando su nombre de usuario: no creo que su lógica String(data.match(/\S+/)) se comporte de la manera en que lo está esperando (acredite a @Engineer por detectar esto).

Su expresión de coincidencia va a devolver uno o dos tipos de valores: null o Array. En el caso de que sea nulo, como señaló @Engineer, terminas pasando en "null" como una cadena, que luego debería pasar tu verificación de nombre de usuario. Usted debe considerar la revisión de este a:

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

En cuanto .length igual a 1 en todos los casos - que no lo hace honestamente hacen mucho sentido. Recomendaría agregar muchas declaraciones console.log() para tratar de descubrir qué está pasando.

+0

Esto soluciona el problema con la primera parte de la evaluación (gracias), pero ahora username.length siempre evalúa a 1, sin importar por cuánto tiempo estén ingresando los datos. ¿Alguna idea? –

+0

Hrm, en realidad, esto tampoco funciona ... if (username) evalúa como verdadero si es nulo o no ... –

+0

Eventualmente quiero que la verificación de longitud sea más ... es un marcador de posición para una lógica más compleja . –

1

Probar

if (us ername === null || username.toString(). length < 1)

Utilicé if (username === null || username.length < 1) y no se pudo comprobar a fondo.

Cuestiones relacionadas