当string可能为空时,确定节点JS中的string长度

我正在尝试学习Node,并具有以下function:

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)) { 

我已经尝试了==和===,但我仍然收到错误,因为用户名未检测到它为空,并且username.length()失败:

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

我确信Node不会评估||的第二部分 在if语句中,当第一部分是真实的 – 但我不明白为什么if语句的第一部分计算为false时,用户名是一个空对象。 有人能帮我理解我做错了什么吗?

你传递String(data.match(/\S+/))作为username参数,所以当data.match(/\S+/)null ,你会得到"null"

 String(null) === "null" 

所以你需要改变你的状况:

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

length是一个属性,而不是一个函数。 试试username.length

如果你需要一个非空的string,你可以做一个简单的“truthy”检查,将工作为nullundefined ,等等:

 if (username) { ... } 

用这种方法,你甚至不需要.length检查。 另外, length是一个属性,而不是一个方法。


编辑:你有一些funkiness继续。 我认为你需要从如何传递用户名开始 – 我不认为你的String(data.match(/\S+/))逻辑的行为是你所期望的@Engineer发现这一点)。

您的匹配expression式将返回一个或两个types的值: null或一个Array 。 在@Engineer指出的情况下它是空的,最终会以"null"作为string传递,这将最终通过您的用户名检查。 你应该考虑修改这个:

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

关于.length在所有情况下都等于1 ,这并不是真的很有意义。 我会build议添加大量的console.log()语句来试图弄清楚发生了什么事情。

尝试

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

我用if(username === null || username.length <1),并且在长度检查时失败。