Node.js 如何返回 JSON:从基础到实践的完整指南
在 Web 开发中,JSON(JavaScript Object Notation)因其轻量级、易解析的特性,已成为前后端数据交互的主流格式,Node.js 作为后端开发的核心技术,如何正确返回 JSON 数据是开发者的必备技能,本文将从基础概念出发,结合代码示例,详细介绍 Node.js 返回 JSON 的多种方法及最佳实践。
基础篇:使用原生 HTTP 模块返回 JSON
Node.js 内置的 http 模块是创建 HTTP 服务的基础,通过它可以手动处理请求和响应,实现 JSON 数据的返回。
核心步骤
要返回 JSON 数据,需满足三个关键条件:
- 设置正确的响应头:
Content-Type: application/json,告诉客户端返回的是 JSON 格式数据。 - 将数据转换为 JSON 字符串:JavaScript 对象需通过
JSON.stringify()转换为字符串,否则会返回[Object object]。 - 处理跨域问题(可选):如果前端与后端端口不同,需设置 CORS 头部(
Access-Control-Allow-Origin)。
代码示例
以下是一个使用原生 http 模块返回 JSON 的简单示例:
const http = require('http');
// 模拟要返回的 JSON 数据
const responseData = {
status: 'success',
data: {
id: 1,
name: 'Node.js JSON 示例',
version: '18.0.0'
},
timestamp: new Date().toISOString()
};
// 创建 HTTP 服务器
const server = http.createServer((req, res) => {
// 1. 设置响应状态码和头部
res.writeHead(200, {
'Content-Type': 'application/json', // 声明返回 JSON 格式
'Access-Control-Allow-Origin': '*' // 允许跨域(开发环境)
});
// 2. 将数据转换为 JSON 字符串并返回
res.end(JSON.stringify(responseData));
});
// 启动服务器
server.listen(3000, () => {
console.log('服务器已启动,访问 http://localhost:3000');
});
执行结果:
通过浏览器或 API 工具访问 http://localhost:3000,会得到如下 JSON 响应:
{
"status": "success",
"data": {
"id": 1,
"name": "Node.js JSON 示例",
"version": "18.0.0"
},
"timestamp": "2023-10-01T12:00:00.000Z"
}
进阶篇:使用 Express 框架返回 JSON
原生 http 模块需要手动处理很多细节(如路由、头部设置等),实际开发中更推荐使用 Express 框架——它简化了服务器创建和路由处理,提供了更优雅的 JSON 返回方式。
Express 返回 JSON 的核心方法
Express 提供了 res.json() 方法,它会自动完成以下操作:
- 设置
Content-Type为application/json; - 调用
JSON.stringify()将对象转换为字符串; - 处理中文等特殊字符(默认启用
json: true时会避免 Unicode 转义)。
基础示例
首先安装 Express(如果未安装):
npm install express
然后创建服务器文件 express-server.js:
const express = require('express');
const app = express();
const port = 3000;
// 模拟数据
const users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 }
];
// GET 请求返回 JSON 列表
app.get('/users', (req, res) => {
res.json({
status: 'success',
data: users,
total: users.length
});
});
// GET 请求返回单个用户(通过路由参数)
app.get('/users/:id', (req, res) => {
const userId = parseInt(req.params.id);
const user = users.find(u => u.id === userId);
if (user) {
res.json({
status: 'success',
data: user
});
} else {
res.status(404).json({
status: 'error',
message: '用户不存在'
});
}
});
// 启动服务器
app.listen(port, () => {
console.log(`Express 服务器已启动,访问 http://localhost:${port}`);
});
测试结果:
- 访问
http://localhost:3000/users,返回用户列表 JSON; - 访问
http://localhost:3000/users/1,返回指定用户 JSON; - 访问
http://localhost:3000/users/999,返回 404 错误 JSON。
高级用法:自定义 JSON 序列化
Express 默认的 res.json() 会使用 JSON.stringify() 的默认行为,但有时需要自定义序列化逻辑(如过滤敏感字段、格式化日期等),可通过 res.set() 和 res.send() 组合实现:
app.get('/user-sensitive', (req, res) => {
const user = {
id: 1,
name: 'Charlie',
password: '123456', // 敏感字段,需过滤
createdAt: new Date()
};
// 自定义序列化:过滤 password 字段,格式化日期
const serializedUser = JSON.stringify(user, (key, value) => {
if (key === 'password') return undefined; // 过滤 password
if (key === 'createdAt') return value.toISOString(); // 格式化日期
return value;
});
res.set('Content-Type', 'application/json');
res.send(serializedUser);
});
实践篇:处理常见问题与最佳实践
问题 1:返回 JSON 时中文乱码
现象:使用 res.json() 返回中文时,部分场景下可能出现乱码(如旧版浏览器或特定响应头配置)。
解决:确保 Content-Type 包含 charset=utf-8,Express 的 res.json() 默认已处理,但手动设置时需注意:
res.set('Content-Type', 'application/json; charset=utf-8');
res.json({ message: '你好,世界' });
问题 2:CORS 跨域问题
现象:前端页面(如 http://localhost:8080)请求后端(http://localhost:3000)时,浏览器因同源策略拦截请求。
解决:使用 cors 中间件自动处理 CORS 头部。
安装 cors:
npm install cors
在 Express 中使用:
const cors = require('cors');
app.use(cors()); // 允许所有来源
// 或限制特定来源
// app.use(cors({ origin: 'http://localhost:8080' }));
问题 3:统一错误处理与 JSON 格式
场景:实际项目中需要统一的错误响应格式(如 { code: 400, message: '参数错误' })。
解决:通过 Express 的中间件统一处理错误:
// 自定义错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
code: 500,
status: 'error',
message: '服务器内部错误',
details: process.env.NODE_ENV === 'development' ? err.message : undefined
});
});
// 模拟一个路由错误
app.get('/error', (req, res, next) => {
const error = new Error('这是一个测试错误');
next(error); // 传递给错误处理中间件
});
最佳实践
- 保持 JSON 结构一致性:例如统一使用
{ status, data, message }结构,方便前端解析。 - 避免返回敏感信息:序列化时过滤
password、token等字段,或使用class-transformer等库。 - 合理设置状态码:成功用
200,创建资源用201,客户端错误用4xx,服务端错误用5xx。 - 使用环境变量区分配置:开发环境启用详细错误信息,生产环境隐藏敏感细节。
Node.js 返回 JSON 的方式从原生 http 模块的手动处理,到 Express 框架的 res.json() 自动化封装,已变得非常高效,开发者应根据项目需求选择合适的方式:
- 学习或简单场景:使用原生
http模块,理解底层原理; - 实际项目开发:优先选择 Express,结合
cors、中间件



还没有评论,来说两句吧...