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

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

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

我确定 Node 不会评估 || 的第二部分。在第一部分为真时的 if 语句中 - 但我不明白为什么当用户名是空对象时 if 语句的第一部分评估为假。有人可以帮我理解我做错了什么吗?

4

4 回答 4

11

length是属性,不是函数。尝试username.length

于 2012-05-17T12:29:01.823 回答
7

String(data.match(/\S+/))作为username参数传递,所以当data.match(/\S+/)is时null,你得到"null"not nullfor username,因为:

String(null) === "null"

所以你需要改变你的条件:

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

如果你需要一个非空字符串,你可以做一个简单的“真实”检查,它适用于null, undefined,''等:

if (username) { ... }

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


编辑:你有一些时髦。我认为您需要从传递用户名String(data.match(/\S+/))的方式开始 - 我不认为您的逻辑表现得像您期望的那样(感谢@Engineer 发现这一点)。

您的匹配表达式将返回一种或两种类型的值:nullArray. 在它为空的情况下,正如@Engineer 指出的那样,你最终会"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 回答
1

尝试

如果(用户名 === null || username.toString().length < 1 )

我使用了 if( username === null || username.length < 1 ),但长度检查失败。

于 2016-06-16T04:12:11.910 回答