上一篇文章中,介绍了Node.js构建一个非常简单的Web应用后台:
Node.js从0到1:如何构建一个Web服务器 – 每天进步一点点
本文在上文的基础上,实习如下功能:
(1)创建前台页面,使用Ajax访问后台接口
(2)后台返回json数据
本文源代码在文章末尾。
1.JSON格式数据
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,并非 Node.js 特有,但 Node.js 内置了完善的 JSON 处理能力,常用来存储配置、传输接口数据
JSON 是字符串格式(不是对象),有严格语法规则,和 JS 对象的关键区别:
| 特性 | JSON格式 | JS对象 |
| 键名 | 必须用双引号包裹 | 可省略引号、单引号、双引号 |
| 值类型 | 仅支持:字符串、数字、布尔、数组、对象、null | 支持所有 JS 类型(函数、undefined、Symbol 等) |
| 末尾逗号 | 不允许有多余逗号 | 部分环境允许 |
| 本质 | 字符串(文本) | 内存中的对象 |
示例:
// 合法的 JSON 字符串(注意双引号、无末尾逗号)
const jsonStr = '{"name":"张三","age":25,"isActive":true,"hobbies":["跑步","看书"],"address":null}';
// JS 对象(语法更灵活)
const jsObj = { name: '张三', age: 25, isActive: true, hobbies: ['跑步','看书'], address: null };
JSON 数组是 JSON 格式中用于存储有序、同类型 或不同类型数据集合的结构,语法和 JS 数组相似但有严格约束,是接口返回列表数据、配置文件存储多个项的常用形式。
JSON 数组必须满足以下规则(区别于 JS 数组的关键):
| 特性 | JSON 数组要求 | JS 数组特点 |
| 包裹符号 | 必须用 [] 包裹 | 同 JSON 数组 |
| 元素分隔 | 元素间用逗号分隔,末尾不能有多余逗号 | 部分环境允许末尾逗号 |
| 元素类型 | 仅支持 JSON 合法类型:字符串(双引号)、数字、布尔、数组、对象、null | 支持所有 JS 类型(函数、undefined、Symbol 等) |
| 字符串元素 | 必须用双引号包裹 | 可单引号 、双引号 、反引号 |
合法 JSON 数组示例(字符串形式):
// 1. 基础类型数组
const jsonArr1 = '[10, 20, 30, 40]'; // 数字数组
const jsonArr2 = '["张三", "李四", "王五"]'; // 字符串数组(双引号)
const jsonArr3 = '[true, false, null]'; // 布尔/null 数组
// 2. 复杂类型数组(对象数组,接口返回列表的常见格式)
const jsonArr4 = '[{"id":1,"name":"张三"},{"id":2,"name":"李四"}]';
// 3. 嵌套数组
const jsonArr5 = '[[1,2],[3,4],[{"key":"value"}]]';
(1)JSON.stringify()方法
Web应用中向服务器发送的数据一般是JSON字符串,我们可以使用JSON.stringify()方法将JavaScript对象转换为JSON字符串后进行发送,语法格式为:
JSON.stringify(value,[,replace[,space]])
返回:包含JSON文本的字符串
参数说明如下:
value:需要转换的JavaScript对象(通常为对象或数组),必选参数。
replace:用于转换结果的函数或数组。
space:文本添加的缩进,空格和换行符。
(2)JSON.parse()方法
Web应用中从服务器接收的数据一般也是JSON字符串,可以使用JSON.parse()方法将JSON字符串转换为JavaScript对象进行逻辑处理,语法为:
JSON.parse(text[,reviver])
返回:JSON字符串转换后的对象
参数说明:
text:需要转换的JSON字符串,必选参数
reviver:一个用于转换结果的函数,将对对象的每个成员调用此函数
一个转换的例子:
// ==================== JSON.parse():JSON字符串 → JS对象/数组 ====================
// 1. 解析JSON对象字符串
const jsonObjStr = '{"name":"张三","age":25}';
const jsObj = JSON.parse(jsonObjStr);
console.log('JSON.parse解析对象:', jsObj); // 输出可操作的JS对象
console.log('访问对象属性:', jsObj.name); // 输出:张三
// 2. 解析JSON数组字符串
const jsonArrStr = '[{"id":1},{"id":2}]';
const jsArr = JSON.parse(jsonArrStr);
console.log('JSON.parse解析数组:', jsArr); // 输出可操作的JS数组
console.log('访问数组元素:', jsArr[0].id); // 输出:1
// ==================== JSON.stringify():JS对象/数组 → JSON字符串 ====================
// 1. 序列化JS对象
const userObj = { name: '李四', age: 30 };
const jsonStr1 = JSON.stringify(userObj);
console.log('JSON.stringify序列化对象:', jsonStr1); // 输出:{"name":"李四","age":30}
// 2. 序列化JS数组
const listArr = [{ id: 1 }, { id: 2 }];
const jsonStr2 = JSON.stringify(listArr);
console.log('JSON.stringify序列化数组:', jsonStr2); // 输出:[{"id":1},{"id":2}]
运行结果:
JSON.parse解析对象: { name: '张三', age: 25 }
访问对象属性: 张三
JSON.parse解析数组: [ { id: 1 }, { id: 2 } ]
访问数组元素: 1
JSON.stringify序列化对象: {"name":"李四","age":30}
JSON.stringify序列化数组: [{"id":1},{"id":2}]
2.后台返回JSON格式
我们在上一个项目的基础上,新增一个文件

文件名称为product.json

json文件内容参考如下:
{
"data": [
{
"id": 1001,
"name": "纯棉短袖T恤",
"size": "XL",
"price": 89.9,
"time": "2026-02-06 10:15:30"
},
{
"id": 1002,
"name": "休闲牛仔裤",
"size": "32码",
"price": 159.99,
"time": "2026-02-06 11:20:15"
},
{
"id": 1003,
"name": "透气运动鞋",
"size": "42码",
"price": 299.0,
"time": "2026-02-06 14:05:45"
}
]
}
修改index.js文件,让服务器返回json数据
var http = require('http');
var fs = require('fs'); //引入文件系统模块
var server = http.createServer(); //创建服务器对象
server.on('request', function(request, response) { //事件驱动编程
response.setHeader('Access-Control-Allow-Origin', '*'); //设置允许跨域访问
response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); //设置响应头,防止中文乱码
fs.readFile('./product.json', 'utf8', function(err, data) { //读取文件内容
if (err) {
response.writeHead(500, {'Content-Type': 'text/plain; charset=utf-8'});
response.end('服务器错误');
return;
}
response.end(data);
});
});
//启动服务器,监听3000端口
server.listen(4000, function() {
console.log('Server is listening on port 4000');
});

在控制台中输入node index.js,运行node项目
然后打开浏览器,输入localhost:4000,查看项目返回数据

这样,后台就返回一个json数据了。
3.前台请求后台接口
在项目中,增加一个前台的html文件,用来访问后台接口

文件名index.html

index.html文件参考代码如下:
<section class="product">
<h2>Product List</h2>
<ul id="product-list"></ul>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script>
$(function() {
$.ajax({
url: 'http://localhost:4000', //请求本地服务器
method: 'GET',
dataType: 'json',
success: function(data) {
console.log(data);
var productList = $('#product-list');
for (var i = 0; i < data.data.length; i++) {
var product = data.data[i];
var listItem = $('<li></li>').text(product.name + ' - $' + product.price);
productList.append(listItem);
}
},
error: function() {
alert('Failed to load product data.');
}
});
});
</script>
</section>

4.效果
在vscode中,按F5,运行index.html文件,也可以在文件管理器中双击运行index.html文件,可以看到运行的结果。

可以看到,前端页面正常返回了数据,并渲染到index.html页面中了。
本文源代码下载(访问密码: 7381):
https://url47.ctfile.com/f/64055047-8671284230-a6c29c?p=7381