目录

TypeError: undefined is not a function
TypeError: Cannot read property 'xxx' of undefined 或者 TypeError: Cannot read property 'xxx' of null
检查变量是未赋值
检查函数是否有返回值
检查变量是否引用了某个对象不存在的属性
检查调用函数时是否未该传递参数
俗话说“常在河边走,哪能不湿鞋”,只要动手写程序,总会时不时的冒出点问题来, 很难一下子就写出完全正确运行的程序。哪怕只是拿别人的程序来运行,也不能保证其能 适应各种各样的系统环境,不作任何修改就能使用。因此,学会一些简单的排错方法是很 有必要的。

在 Node.js 程序运行过程中,当出现没有被捕捉到的异常时,程序会打印出相应的出错 信息,并终止运行。比如以下出错信息:

f:tmp2013-10-7t.js:3
proceess.nextTick(function () {
^
ReferenceError: proceess is not defined

at Object.<anonymous> (f:\tmp\2013-10-7\t.js:3:1)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:901:3

出错信息的第 1 行 f:tmp2013-10-7t.js:3 指明了在文件 f:tmp2013-10-7t.js 的第 3 行出错了;

出错信息的第 2 行是相应的源程序 proceess.nextTick(function () { ;

出错信息的第 3 行的 ^ 指明了在该行的具体位置 proceess ;

出错信息的第 4 行是具体的出错信息 ReferenceError: proceess is not defined ,后面 还有几行以 at 开头的内容是详细的调用堆栈信息,可以以此来追踪到整个程序的 执行流程。

当遇到这样的出错信息时,我们首先应该看第 4 行的 ReferenceError: proceess is not defined ,前面的 ReferenceError 是错误对象, 表示这是一个“非法引用”错误,其后便相应的提示信息,大概意思是“ proceess 未定义” (看不懂可以用软件翻译一下,比如 有道词典), 这时候我们再往上看原来的程序是怎么写的:proceess.nextTick(function () { 。 从这个程序可以看出来,要调用的应该是 process.nextTick() , 此处不小心把 process 写成了 proceess ,程序自然就报错“ proceess 未定义”了。

常见的错误对象有以下这些:

EvalError : 错误发生在 eval() 函数中,一般是要使用 eval() 执行的代码有语法错误
RangeError : 数字的值超过 javascript 可表示的范围
ReferenceError : 使用了非法的引用,一般是引用了一个未定义的变量或者函数
SyntaxError : 在 eval()函数调用中发生了语法错误
TypeError : 变量的类型不是预期所需的
URIError : 在 encodeURI()或者 decodeURI()函数中发生的错误
记住这些常见的错误对象有助于更快速地理解出错信息。

TypeError: undefined is not a function

出现这种错误的原因是某个变量不是 Function 类型,却把它当函数来调用了。例如:

帖子: 《node 连接 mysql 出错》

Node.js 代码:

var Client = require('mysql').Client;
var client = new Client();
client.host = 'localhost';
client.port = 3306;
client.user = 'root';
client.password = '123456';
client.database='test1';

query(client);

function query (client) {
client.query('select * from user', function (err, res, fields) {

console.log(res);
client.end();

});
}
出错信息:

/home/king/node/mysql.js:2
var client = new Client();

         ^

TypeError: undefined is not a function

at Object.<anonymous> (/home/king/node/mysql.js:2:14)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:901:3

由出错信息可以看出,在执行 new Client() 时出错了, TypeError: undefined is not a function ,也就是说,此时 Client 的值是 undefined 。我们再往上看,可以看到 var Client = require('mysql').Client 那么,应该是 mysql 这个模块并没有输出 Client 这个函数,我们可以执行 console.log(require('mysql')) 来打印 mysql 模块的输出,也确定并没有 Client 这一项,这时候就应该详细看一下 mysql 模块帮助文档以及其正确的使用方法了。

TypeError: Cannot read property 'xxx' of undefined 或者 TypeError: Cannot read property 'xxx' of null

出现这种错误的原因是尝试读取一个值为 undefined 或 null 的变量的属性。比如如下代码:

var a = undefined;
console.log(a.b);
执行该程序将会抛出异常:

TypeError: Cannot read property 'b' of undefined

at repl:1:15
at REPLServer.self.eval (repl.js:110:21)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
at ReadStream.EventEmitter.emit (events.js:98:17)
at emitKey (readline.js:1095:12)

当出现这种情况时,我们可以通过以下方法来排查:

检查变量是未赋值

假如只通过 var a 来声明了变量,但未赋值,此时变量的值为 undefined ,示例:

var a; // 没有赋值
console.log(a.b);
检查函数是否有返回值

当函数没有用 return 来返回一个值时,那么这个函数的返回值就是 undefined , 示例:

function f () {
// 没有返回值
}
var a = f();
console.log(a.b);
检查变量是否引用了某个对象不存在的属性

当引用了某个对象一个不存在的属性时,其值就是 undefined ,示例:

var obj = {};
var a = obj.c; // 引用了一个不存在的属性 千锋PHP-PHP培训的实力派
console.log(a.b);
检查调用函数时是否未该传递参数

当调用某个函数时没有按要求传递足够的参数,则在函数体内该参数的值是 undefined , 示例:

function f (a) {
console.log(a.b);
}
f(); // 本来该函数需要 1 个参数

《Node.js 入门系列》—— 一些简单的排错方法(一)相关推荐

  1. node.js入门系列(一)--Node.js简介

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...

  2. 转载:Node.js入门系列——《深入浅出Node.js》

    作者:田永强 日期:2011-12-02 完整版 前言: Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS ...

  3. hapi.js入门系列(一)——一个简单的Hello World程序

    目录 简介 一.安装hapi 1.1 创建项目 1.2 初始化package.json 1.3 安装Hapi依赖 二.一个简单的hello world程序 2.1 创建一个最基础的服务 2.2 添加一 ...

  4. node.js入门 - 9.api:http

    node一个重要任务是用来创建web服务,接下来我们就学习与此相关的一个重要的api -- http.我们使用http.createServer()创建一个http服务的实例,用来处理来自客户的请求. ...

  5. 《Node.js入门》Windows 7下Node.js Web开发环境搭建笔记

    最近想尝试一下在IBM Bluemix上使用Node.js创建Web应用程序,所以需要在本地搭建Node.js Web的开发测试环境. 这里讲的是Windows下的搭建方法,使用CentOS 的小伙伴 ...

  6. Node.js 入门到干活,10 个优质项目就够了!

    Node.js 在很多大公司都有不错的实践,比如:淘宝.天猫 Web 版,很多页面都是在 Node 服务器上渲染的.还有各种脚手架.前端打包发布工具.构建生态的小工具,也基本都是 Node.js 编写 ...

  7. js读取http chunk流_极简 Node.js入门 教程双工流

    点击上方蓝字关注我们 小编提示: 本文是由 ICBU 的谦行小哥哥出品,我们会持续发出极简 Node.js入门 教程,敬请期待哦,文中有比较多的演示代码建议横屏阅读 双工流就是同时实现了 Readab ...

  8. Node.js 入门知识点总结

    Noed.js 快速入门 前言 node.js 入门 环境配置 hello node.js node.js 获取参数 node.js 模块系统 node.js 路由 node.js 文件操作 使用 n ...

  9. html js不触发_「万字整理 」这里有一份Node.js入门指南和实践,请注意查收 ??

    前言 什么是 Node.js 呢 ? JS 是脚本语言,脚本语言都需要一个解析器才能运行.对于写在 HTML 页面里的 JS,浏览器充当了解析器的角色.而对于需要独立运行的 JS,NodeJS 就是一 ...

最新文章

  1. startActivityForResult和setResult详解
  2. Java--获取request中所有参数的方法
  3. 北妈每日一学:ES6 之 模块化-重要!
  4. android侧滑菜单ui,Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单
  5. 开源监控系统Prometheus介绍
  6. sublime配置python编译环境及代码补全功能
  7. 杭电 OJ 提交代码需要注意的问题
  8. 语义模型及自然语言处理系统基础算法
  9. 在龙芯机器上编译OpenJDK8
  10. wifi连接过程抓包
  11. 课题:交通标志识别——设计思路与实现步骤记录
  12. 计算机二级office应用与设计,全国计算机等级考试二级教程——MS Office高级应用与设计(2021年版)...
  13. 程序员编程规范之注释
  14. 阿波罗java_携程Apollo(阿波罗)配置中心的Java样例客户端启动和调试
  15. -fpie -pie_Google的Pie Noon,TI-83上的Super Smash Bros等
  16. java零项目经验,找工作前该如何准备项目?面试时又该怎么说?
  17. easyrecovery2023免费绿色版电脑数据恢复软件
  18. MCU-51:单片机DS18B20温度报警器
  19. Warning: Can save best model only with val_acc available, skipping
  20. Oracle Sqlplus命令登录的几种方式

热门文章

  1. Spring AOP(三)--XML方式实现
  2. MySQL提供了以下三种方法用于获取数据库对象的元数据
  3. golang log日志
  4. 雅礼集训 2017 Day1
  5. codeforces 919E Congruence Equation
  6. 架构之美—软件架构6大步骤(开篇)
  7. [导入]C#实现Des加密和解密
  8. 兰州财经大学JAVA期末考什么_兰州财经大学大学国文下答案
  9. 订阅mysql的二进制日志_MySQL二进制日志
  10. pytorch已经安装成功了为什么不能使用import_使用auto keras的过程