《Node.js 入門系列》—— 一些簡單的排錯方法(一)

目錄

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 個參數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281788.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內置IOC容器ServiceCollection

.NetCore內置IOC容器ServiceCollection一、IOC介紹IOC&#xff1a;全名(Inversion of Control)-控制反轉IOC意味著我們將對象的創建控制權交給了外部容器&#xff0c;我們不管它是如何創建的&#xff0c;我們只需要知道&#xff0c;當我們想要某個實例時&#xff0c;我們可以直…

java中 有沒有方法將瀏覽器標簽欄去掉_用JS去掉IE窗口的標題欄,工具欄,地址欄...

前言:經常上網的朋友可能會到過這樣一些網站&#xff0c;一進入首頁立刻會彈出一個窗口&#xff0c;或者按一個連接或按鈕彈出&#xff0c;通常在這個窗口里會顯示一些注意事項、版權信息 、警告、歡迎光顧之類的話或者作者想要特別提示的信息。其實制作這樣的頁面效果非常的容…

React+Redux仿Web追書神器

引言 由于 10 月份做的 React Native 項目沒有使用到 Redux 等庫&#xff0c;寫了一段時間想深入學習 React&#xff0c;有個想法想做個 demo 練手下&#xff0c;那時候其實還沒想好要做哪一個類型的&#xff0c;也看了些動漫的&#xff0c;小說閱讀&#xff0c;聚合資源的開源…

【算法】LeetCode算法題-Maximum Subarray

這是悅樂書的第154次更新&#xff0c;第156篇原創 01 看題和準備 今天介紹的是LeetCode算法題中Easy級別的第13題&#xff08;順位題號是53&#xff09;。給定一個整數數組nums&#xff0c;找出一個最大和&#xff0c;此和是由數組中索引連續的元素組成&#xff0c;至少包含一個…

windows配置solr5.5.2(不通過tomcat,使用內置jetty)

一、windows下配置solr5.5.2(不通過tomcat,使用內置jetty) 第一步&#xff1a;安裝Jdk1.7 Solr5.5好像只支持Jdk1.7及以上的版本&#xff0c;沒親測&#xff0c;solr6.0是只支持jdk1.8及以上的&#xff0c;下圖為啟動solr時的截圖&#xff1a; 如何在windows環境下配置jdk及驗證…

java起源英文_Abbreviation 英文詞組縮寫(來源:南陽理工大學ACM)java

As we know, we often use a short sequence of characters in place of some words with a very long name. For example, ACM is an abbreviation of “Association for Computing Machinery”. Now we are using an acronymic method to get the abbreviation. An acronym i…

【C# Personal Handbook】運行環境

一、CLR、CLI、CTS、CLS、BCL、FCL簡介CLI&#xff08;公共語言基礎&#xff09;CLI是微軟公司向ECMA提交的一份語言和數據格式規范&#xff0c;CLR是目前為止唯一一個公共語言基礎的實現版本。CLI包括了公共類型系統&#xff08;CTS&#xff09;、公共中間語言&#xff08;CIL…

如何完善自己的知識結構

★領域 &#xff08;本來想用“學科”這個詞&#xff0c;后來覺得“學科”的范疇還是偏小&#xff0c;就改用“領域”&#xff09;  按照傳統的習慣&#xff0c;通常會把知識歸類到不同的領域&#xff08;比如&#xff1a;文學、數學、計算機、烹調、等等&#xff09;。 ◇領…

MATLAB編程與應用系列-關于MATLAB編程入門教程的總體編寫安排

本系列教程來源于出版設計《基于MATLAB編程基礎與典型應用書籍》&#xff0c;如涉及版權問題&#xff0c;請聯系&#xff1a;156204968qq.com。 出版社&#xff1a;人民郵電出版社&#xff0c; 頁數&#xff1a;525。 本系列教程目前基于MATLABR2006a&#xff0c;可能對于更高級…

python語言特性-------python2.7教程學習【廖雪峰版】(一)

開始學習廖雪峰的py2.7教程&#xff1a; 2017年6月5日12:54:28 筆記&#xff1a; 廖雪峰python2.7教程1.用任何編程語言來開發程序&#xff0c;都是為了讓計算機干活。 2.Python是一種相當高級的語言。代碼少還不好&#xff1f;代碼少的代價是運行速度慢。3.用Python可以做什么…

java調c++代碼_Java中調用C++代碼的實現 | 學步園

JNI為 Java Native Interface 即Java本地接口&#xff0c;使用此種方式可以對C/C代碼進行調用&#xff0c;其在本質上是對C/C生成的動態庫進行調用而不是直接對C/C代碼進行調用Java代碼如下&#xff1a;public class TestJNI{//JNI在本質上是調用C/C的動態庫來實現的&#xff…

jeesite1.X 集成多數據源

2019獨角獸企業重金招聘Python工程師標準>>> 網上看了幾個例子&#xff0c;都是相同數據源的動態切換&#xff0c;如果不是同一種數據庫類型&#xff0c;分頁查詢就出問題。經過研究解決問題。 jeesite.properties配置多數數據源地址,這里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自動水平伸縮

Horizontal Pod Autoscaling in Kubernetes寫在前面我們平時部署web服務&#xff0c;當服務壓力大撐不住的時候&#xff0c;我們會加機器(加錢)&#xff1b;一般沒有上容器編排是手動加的&#xff0c;臨時加的機器&#xff0c;臨時部署的服務還要改Nginx的配置&#xff0c;最后…

jQuery 基金會和 Dojo 基金會合并:Open Web

統一基金會&#xff0c;服務開發人員&#xff0c;推動開放 Web 技術發展jQuery 基金會和 Dojo 基金會今天宣布計劃聯合&#xff0c;旨在建立最大&#xff0c;最多樣化和最全面的基金會&#xff0c;通過服務開發者&#xff0c;他們的項目&#xff0c;他們的社區來構建開放的 Web…

spark java 邏輯回歸_邏輯回歸分類技術分享,使用Java和Spark區分垃圾郵件

原標題&#xff1a;邏輯回歸分類技術分享&#xff0c;使用Java和Spark區分垃圾郵件由于最近的工作原因&#xff0c;小鳥很久沒給大家分享技術了。今天小鳥就給大家介紹一種比較火的機器學習算法&#xff0c;邏輯回歸分類算法。回歸是一種監督式學習的方式&#xff0c;與分類類似…

jQuery.extend()方法

定義和用法jQuery.extend()函數用于將一個或多個對象的內容合并到目標對象。 注意&#xff1a; 1. 如果只為$.extend()指定了一個參數&#xff0c;則意味著參數target被省略。此時&#xff0c;target就是jQuery對象本身。通過這種方式&#xff0c;我們可以為全局對象jQuery添加…

1066. 圖像過濾(15)

原題: https://www.patest.cn/contests/pat-b-practise/1066 思路: 開胃小菜 實現: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 題…

Wget用法、參數解釋的比較好的一個文章

一個語句就可以下載cvpr2016的全部論文&#xff1a; wget -c -N --no-clobber --convert-links --random-wait -r -p -E -e robotsoff -U mozilla http://www.cv-foundation.org/openaccess/CVPR2016.py 其中&#xff0c;-c表示斷點續傳&#xff1b;-N表示已經下載的內容不再重…

.NET VS智能提示漢化 (.Net6)

先上現成的.net6漢化文件&#xff0c;可以手動下載后參照 [如何為 .NET 安裝本地化的 IntelliSense 文件 ](https://learn.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense)進行安裝。或者使用后文的工具進行自動安裝。無對照英文在前中文在前漢化內容來自 官…

go 返回mysql數組_Go基礎之--操作Mysql(一)

關于標準庫database/sqldatabase/sql是golang的標準庫之一&#xff0c;它提供了一系列接口方法&#xff0c;用于訪問關系數據庫。它并不會提供數據庫特有的方法&#xff0c;那些特有的方法交給數據庫驅動去實現。database/sql庫提供了一些type。這些類型對掌握它的用法非常重要…