$ cd api
$ npm init
$ npm i express body-parser

接下來,我們創(chuàng)建一個(gè)index.js文件作為我們主服務(wù)器腳本。

const express = require("express");
const bodyParser = require("body-parser");

const users = [{ id: 0, name: "admin" }];

const server = express();
server.use(bodyParser.json());

server.get("/users", (_, response) => response.send({ users }));
server.get("/users/:id", ({ params: { id } }, response) => {
const user = users[id];
response.send({ user });
});
server.post("/users", ({ body }, response) => {
const { user } = body;
user.id = users.length;
users.push(user);
response.send({ user });
});

server.listen(9999, () =>
console.log("API running on http://localhost:9999")
);

我們使用該users數(shù)組作為內(nèi)存數(shù)據(jù)存儲(chǔ)。它使用管理員用戶進(jìn)行初始化。

接下來,我們創(chuàng)建 Expressserver并使用包的 JSON 中間件bodyParser;它允許我們?cè)L問存儲(chǔ)在 HTTP 請(qǐng)求正文中的 JSON 字符串的值POST

然后,我們創(chuàng)建三個(gè) API 端點(diǎn)。兩個(gè)GET端點(diǎn)用于我們根據(jù) ID 請(qǐng)求所有用戶和一個(gè)特定用戶的列表,一個(gè)POST端點(diǎn)用于創(chuàng)建新用戶。

讓我們使用以下命令啟動(dòng) API!

$ node .
API running on http://localhost:9999

使用 API

現(xiàn)在我們的 API 已啟動(dòng)并運(yùn)行,我們可以嘗試使用 cURL 進(jìn)行查詢。為此,我們需要打開一個(gè)新的終端窗口并執(zhí)行以下命令。

創(chuàng)建用戶:

$ curl -H "Content-Type:application/json" -d '{"user":{"name": "kay"}}' localhost:9999/users
{"user":{"id":1,"name":"kay"}}

列出所有用戶:

$ curl localhost:9999/users
{"users":[{"id":0,"name":"admin"},{"id":1,"name":"kay"}]}

列出一個(gè)用戶:

$ curl localhost:9999/users/1
{"user":{"id":1,"name":"kay"}}

創(chuàng)建另一個(gè)用戶:

$ curl -H "Content-Type:application/json" -d '{"users":{"name": "xing"}}' localhost:9999/users
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
...

哦不! JSON 中有一個(gè)拼寫錯(cuò)誤,users應(yīng)該是user。由于我們沒有在POST /users端點(diǎn)中處理這個(gè)問題,因此 Express 只是以 HTML 格式的錯(cuò)誤進(jìn)行響應(yīng)。

這是一個(gè)簡(jiǎn)單的例子,可以毫不費(fèi)力地修復(fù)問題,但讓我們用它來啟動(dòng) VS Code 的調(diào)試器,以便我們可以在運(yùn)行時(shí)直接調(diào)查出了什么問題。

使用 VS Code 的調(diào)試器

使用 VS Code 調(diào)試 Node js API 非常容易。

我們檢查要調(diào)試哪個(gè)端點(diǎn),并在端點(diǎn)觸發(fā)的函數(shù)內(nèi)設(shè)置斷點(diǎn)。這可以通過在行號(hào)左側(cè)單擊鼠標(biāo)左鍵來完成。讓我們?cè)?em>第 15 行POST /users找到它,這應(yīng)該是我們的端點(diǎn)函數(shù)的第一行。

VSCode 斷點(diǎn)截圖

然后我們通過點(diǎn)擊頂部菜單的“調(diào)試”->“開始調(diào)試”或按F5來啟動(dòng)調(diào)試器。

VSCode 菜單截圖

VS Code 將為我們啟動(dòng)應(yīng)用程序和調(diào)試器。它還將通過 Node.js 的調(diào)試協(xié)議將兩者鏈接在一起。

然后,我們使用 cURL 重新發(fā)送導(dǎo)致錯(cuò)誤的請(qǐng)求,并嘗試找出發(fā)生了什么。

$ curl -H "Content-Type:application/json" -d '{"users":{"name": "xing"}}' localhost:9999/users

該請(qǐng)求將運(yùn)行鏈接到的函數(shù)POST /users并在其第一行的斷點(diǎn)處暫停。

如果我們查看代碼左側(cè)的側(cè)邊欄,我們可以看到一個(gè)VARIABLES類別,其中包含各種子類別,例如BlockLocal。讓我們打開Local并查看里面有什么。

VSCode 側(cè)邊欄截圖

我們可以看到,我們有兩個(gè)局部變量,body分別是 類型Objectresponse類型ServerResponse

讓我們使用F10進(jìn)入下一行看看會(huì)發(fā)生什么。

一切似乎都按預(yù)期進(jìn)行。

我們?cè)僖淮芜M(jìn)入下一行。

繁榮!

不知為何,我們最終卻到達(dá)了代碼庫的一個(gè)完全不同的位置?

VSCode 文件路徑截圖

看起來我們?cè)谠O(shè)置對(duì)象時(shí)創(chuàng)建了一個(gè)錯(cuò)誤iduser這是怎么發(fā)生的?

讓我們index.js再次打開,將斷點(diǎn)移動(dòng)到第 16 行,然后按F5讓調(diào)試器運(yùn)行到事件循環(huán)的末尾。

然后使用 cURL 重新發(fā)送請(qǐng)求,以查看在我們嘗試設(shè)置之前發(fā)生了什么user.id

當(dāng)我們查看側(cè)邊欄中的“變量/塊”類別時(shí),我們可以看到我們的user對(duì)象實(shí)際上是undefined!如果我們打開“變量/本地”類別,我們也可以看到原因。

VSCode 側(cè)邊欄截圖

我們的body有一個(gè)users屬??性,但是我們嘗試在第 15 行user從中解構(gòu)一個(gè)變量,這導(dǎo)致當(dāng)我們嘗試在第 16 行寫入時(shí)出現(xiàn)錯(cuò)誤。user.id

既然我們知道了問題,讓我們停止調(diào)試器并修復(fù)它。

server.post("/users", ({ body }, response) => {
const { user } = body;

if (!(user instanceof Object))
return response.send({ error: '"user" object missing in JSON!' });

user.id = users.length;
users.push(user);
response.send({ user });
});

讓我們重新啟動(dòng)服務(wù)器,以便它運(yùn)行新代碼:

$ node .
API running on http://localhost:9999

并重新發(fā)送有問題的請(qǐng)求:

$ curl -H "Content-Type:application/json" -d '{"users":{"name": "xing"}}' localhost:9999/users
{"error":"\"user\" object missing in JSON!"}

最后,我們得到一個(gè)有用的 JSON 格式的錯(cuò)誤消息。

結(jié)論

借助 VS Code 的集成調(diào)試器調(diào)試基于 Node js 的 API 是一項(xiàng)簡(jiǎn)單的任務(wù)。我們只需要設(shè)置一個(gè)斷點(diǎn),無需任何額外的代碼。

它為我們提供了許多開箱即用的運(yùn)行時(shí)見解,包括:

原文地址:https://www.moesif.com/blog/technical/debugging/Debugging-a-Node-JS-Express-API-in-VS-Code-Debugger/

上一篇:

使用 Rails 構(gòu)建 RESTful API

下一篇:

如何使用 Nodejs 建立 Web 和 API 產(chǎn)品分析
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)