类别TypeError:undefinedisnotafunctionTypeError:Cannotreadproperty'xxx'ofundefined或TypeError:Cannotreadproperty'xxx'ofnull检查变量是否未赋值avalue检查函数是否有返回值检查变量是否引用了对象中不存在的属性检查调用函数时是否不应该传递参数时不时会出现一些问题,就是很难编写一个可以同时完全正确运行的程序。即使你只是用别人的程序运行,也不能保证它能适应各种系统环境,不加修改就可以使用。因此,有必要学习一些简单的故障排除方法。Node.js程序运行过程中,当出现未捕获的异常时,程序会打印出相应的错误信息并终止运行。例如下面的错误信息:f:tmp2013-10-7t.js:3process.nextTick(function(){^ReferenceError:processisnotdefinedatObject.(f:\tmp\2013-10-7\t.js:3:1)在Module._compile(module.js:456:26)在Object.Module._extensions..js(module.js:474:10)在Module.load(module.js:356:32)在Function.Module._load(module.js:312:12)atFunction.Module.runMain(module.js:497:10)atstartup(node.js:119:16)atnode.js:901:3错误信息Line1off:tmp2013-10-7t.js:3表示文件f:tmp2013-10-7t.js的第3行发生错误;错误信息第2行是对应的源程序process.nextTick(function(){;错误信息第三行的^表示行中具体位置进程;错误信息第四行是具体的错误信息ReferenceError:processisnotdefined,还有几行以at开头的内容是详细的调用栈信息,可以用来追溯整个程序的执行过程。遇到这样的错误信息,首先要看第4行的ReferenceError:processisnotdefined,前面的ReferenceError是错误对象,说明这是一个“非法引用”的错误,后面是相应的提示信息,大概是“processisundefined”的意思(不懂可以用软件翻译,比如有道词典),这时候我们就去查一下原来的程序是怎么写的:process.nextTick(function(){。从这个程序可以看出,调用的应该是process.nextTick()。这里process不小心写成了process,程序自然会报错“processisundefined”。常见的错误对象如下:EvalError:错误发生在eval()函数中。通常,使用eval()执行的代码会出现语法错误。RangeError:数字的值超出了javascript可以表示的范围。ReferenceError:使用了非法引用,一般是指未定义的变量或函数SyntaxError:eval()函数调用中发生语法错误decodeURI()函数记住这些常见的错误对象可以帮助您更快地理解错误消息。TypeError:undefinedisnotafunction出现这个错误的原因是变量不是Function类型,而是作为函数调用。示例:发布:《node 连接 mysql 出错》Node.js代码:varClient=require('mysql').Client;varclient=newClient();client.host='localhost';client.port=3306;client.user='root';client.password='123456';client.database='test1';query(client);functionquery(client){client.query('select*fromuser',function(err,res,fields){console.log(res);client.end();});}错误信息:/home/king/node/mysql.js:2varclient=newClient();^TypeError:undefined不是Object的函数。<匿名>(/home/king/node/mysql.js:2:14)在Module._compile(module.js:456:26)在Object.Module._extensions..js(module.js:474:10)在Module.load(module.js:356:32)在Function.Module._load(module.js:312:12)在Function.Module.runMain(module.js:497:10)在启动时(node.js:119:16)atnode.js:901:3从报错信息可以看出,执行newClient()时出错,TypeError:undefinedisnotafunction,也就是说Client的值是undefined此时。再往上看,可以看到varClient=require('mysql').Client那么,应该是mysql模块没有输出Client函数,我们可以执行console.log(require('mysql'))toprintmysql模块的输出也肯定没有Client这一项。这时候应该详细阅读mysql模块的帮助文档和正确的使用方法。TypeError:Cannotreadproperty'xxx'ofundefined或TypeError:Cannotreadproperty'xxx'ofnull此错误的原因是试图读取值为未定义或null的属性。例如下面的代码:vara=undefined;控制台日志(a.b);执行这个程序会抛出异常:TypeError:Cannotreadproperty'b'ofundefinedatrepl:1:15atREPLServer.self.eval(repl.js:110:21)atInterface.(repl.js:239:12)在Interface.EventEmitter.emit(events.js:95:17)在Interface._onLine(readline.js:202:10)在Interface。_line(readline.js:531:8)在Interface._ttyWrite(readline.js:760:14)在ReadStream.onkeypress(readline.js:99:10)在ReadStream.EventEmitter.emit(events.js:98:17))atemitKey(readline.js:1095:12)遇到这种情况,我们可以通过以下方法排查:检查变量是否未赋值。如果变量只是通过vara声明而没有赋值,则该变量的值是undefined,例子:vara;//没有赋值console.log(a.b);检查函数是否有返回值当函数没有使用return返回值时,那么这个函数的返回值是未定义的,例子:functionf(){//没有返回值}vara=f();控制台日志(a.b);检查变量是否引用了对象中不存在的属性当引用了对象中不存在的属性时,其值是undefined,例子:varobj={};vara=obj.c;//引用了一个不存在的属性console.log(a.b);检查函数是否未被调用传递参数当调用一个函数而没有按要求传递足够的参数时,函数体中参数的值未定义,例如:functionf(a){console.log(a.b);}f();//起初该函数接受1个参数