2012-05-17 25 views
5

sto cercando di imparare Node e hanno la funzione di:Determinare la lunghezza della stringa in Nodo JS quando stringa può essere nullo

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

e sto passando

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

ho provato sia == e ===, ma sto ancora ricevendo errori come nome utente non rileva che si tratta di nulla, e username.length() fallisce su:

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

sono sicuro che Il nodo non valuterà la seconda parte di || nell'istruzione if quando la prima parte è vera, ma non riesco a capire perché la prima parte dell'istruzione if sta valutando false quando il nome utente è un oggetto nullo. Qualcuno può aiutarmi a capire cosa ho fatto di sbagliato?

+0

Elimina questo commento e aggiungilo sotto la mia risposta, continueremo a chattare sotto la mia risposta. – Engineer

risposta

3

si sta passando String(data.match(/\S+/)) come username argomento, in modo che quando data.match(/\S+/) è null, si ottiene "null" non null per username, come:

String(null) === "null" 

quindi è necessario cambiare la vostra condizione:

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

Se stava ottenendo la stringa '" null "', allora non riceverebbe un errore su "" null ".length" '- sarebbe 4. – jmar777

+0

@ jmar777 In questo caso non importa, ' causa 'username ===" null "' è 'true' in questo caso, e il corpo di' if' verrà eseguito. – Engineer

+0

Esatto, ma il codice esistente sta comparando con 'null', non' "null" '- quindi l'errore quando si chiama '.length' è separato.Questa è stata una buona presa sulla funky' String (data.match()) 'cosa però. – jmar777

7

length è un attributo, non una funzione. Provate username.length

+0

O uno 'username' non è una stringa, o stai facendo qualcosa di sbagliato! – Amberlamps

+0

Ho sbagliato - la lunghezza sta valutando correttamente la lunghezza della stringa passata. Tuttavia, questo non risolve il problema originale di come faccio a sapere se ho passato un oggetto nullo? null.length non valuta ?! –

1

Se avete bisogno di una stringa non vuota, si può fare un semplice controllo "truthy" che lavorerà per null, undefined, '', ecc:

if (username) { ... } 

Con questo approccio, si don' ho anche bisogno del controllo .length. Inoltre, length è una proprietà, non un metodo.


Modifica: Hai un po 'di funking in corso. Penso che tu debba iniziare con il modo in cui stai trasmettendo il tuo nome utente - Non credo che la tua logica String(data.match(/\S+/)) si comporti nel modo in cui ci si aspetta (credito a @Engineer per averlo notato).

L'espressione di corrispondenza restituirà uno o due tipi di valori: null o Array. Nel caso in cui sia nullo, come sottolineato da @Engineer, si finisce per passare "null" come una stringa, che dovrebbe in seguito passare il controllo del nome utente più avanti. Si dovrebbe prendere in considerazione una revisione questo:

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

Per quanto riguarda .length essendo pari a 1 in tutti i casi - che non onestamente fanno un sacco di senso. Vorrei raccomandare di aggiungere un sacco di dichiarazioni console.log() per cercare di capire cosa sta succedendo.

+0

Questo risolve il problema con la prima parte della valutazione (grazie), ma ora username.length valuta sempre a 1, indipendentemente dalla lunghezza dei dati. Qualche idea? –

+0

Hrm, in realtà - questo non funziona ... se (username) sta valutando true se è null o no ... –

+0

Alla fine voglio che il controllo della lunghezza sia più ... è un segnaposto per una logica più complessa . –

1

Prova

se (noi nome utente === null || username.toString(). lunghezza < 1)

Ho usato if (nome utente === null || username.length < 1) e non è riuscito a controllare la lunghezza.

Problemi correlati