在Node.js中建一个接口,核心就是用Express框架写一个路由,监听请求并返回JSON数据,整个流程从建项目到跑通不超过10分钟。
很多人第一次接触Node.js后端,脑子里都会冒出一个问题:node服务器怎么做一个接口?百度上搜出来的教程要么太老,要么跳到各种框架,看完还是不知道第一步敲什么,这篇文章直接给出一套能跑通的流程,从原生写法到框架写法,再到参数获取、跨域处理、上线部署,全程跟着做就行。
创建一个接口的核心逻辑
接口的本质就是服务器接收请求,处理业务,返回结果,Node.js做这件事天生有优势,因为JavaScript前后端同语言,小团队一个人能包揽全栈,业内专家指出,Node.js在高并发I/O场景下的表现优于传统同步模型,这也是很多中小型项目选择它的原因。
原生Node写法:不带框架能写吗
能写,但较为零碎,用Node自带的http模块,几十行就能做一个最简单的接口:
const http = require('http');
const server = http.createServer((req, res) => {
// 设置响应头,返回JSON
res.writeHead(200, { 'Content-Type': 'application/json' });
// 判断请求路径
if (req.url === '/api/user' && req.method === 'GET') {
res.end(JSON.stringify({ name: '张三', age: 28, city: '上海' }));
} else {
res.end(JSON.stringify({ code: 404, msg: 'Not Found' }));
}
});
server.listen(3000, () => {
console.log('服务已启动:http://localhost:3000');
});
把这段代码保存为server.js,在终端执行node server.js,浏览器访问http://localhost:3000/api/user就能看到JSON数据。
但这种写法有一个明显痛点: 当接口数量增多,if/else会越堆越多,路由逻辑全挤在一起,维护成本直线上升,这时候就需要引入框架来管理复杂度。
Express框架写法:更符合实战标准
行业共识认为,Express是目前应用最广泛的Node.js web框架,它把路由、中间件、请求处理封装成了简洁的API。
安装express:
npm init -y npm install express
用Express写同一个接口:
const express = require('express');
const app = express();
// 定义GET接口
app.get('/api/user', (req, res) => {
res.json({
code: 0,
data: { name: '李四', age: 25, city: '广州' }
});
});
// 启动监听
app.listen(3000, () => {
console.log('服务器运行中...');
});
对比之下,Express的代码量少了一半,语义也更清晰。res.json()自动返回JSON格式内容,不用手动设置响应头,实际开发中,绝大多数Node.js项目的接口层都是基于Express或Koa这类框架搭建的。
node服务器接口的参数接收与处理
接口不可能只返回固定的数据,更多情况是接收前端传来的参数,做查询或写入操作,参数主要分三种来源:URL路径参数、查询字符串、请求体。
路径参数与查询字符串
路径参数用于标识资源,比如/api/user/1001表示查询id为1001的用户,查询字符串则是/api/user?id=1001这种形式。
// 路径参数
app.get('/api/user/:id', (req, res) => {
const userId = req.params.id;
res.json({ code: 0, data: { id: userId, name: '王五' } });
});
// 查询字符串
app.get('/api/search', (req, res) => {
const keyword = req.query.keyword;
res.json({ code: 0, result: `搜索关键词:${keyword}` });
});
POST请求与请求体解析
POST请求的参数在请求体里,Express默认不解析请求体,需要安装中间件body-parser(Express 4.16版本之后可以用内置的express.json()):
app.use(express.json()); // 解析JSON格式请求体
app.use(express.urlencoded({ extended: true })); // 解析表单格式
app.post('/api/register', (req, res) => {
const { username, password } = req.body;
if (!username || !password) {
return res.json({ code: 1, msg: '用户名和密码不能为空' });
}
// 实际开发中这里会写入数据库
res.json({ code: 0, msg: '注册成功', data: { username } });
});
接口开发中的跨域问题如何处理
前端项目跑在http://localhost:5173(Vite默认端口),后端接口在http://localhost:3000,浏览器会拦截这种跨域请求。处理跨域是node接口开发中绕不开的一环。
CORS中间件方案
推荐用cors中间件,一行代码解决:
npm install cors
const cors = require('cors');
app.use(cors()); // 允许所有跨域请求
如果要限制只允许某个域名访问:
app.use(cors({
origin: 'http://your-web-domain.com'
}));
代理方案(适用于开发环境)
在Vue或React的工程化配置里设置代理,让前端请求走同源路径,由开发服务器转发到后端,这种方案的好处是生产环境不需要额外配置跨域头,两种方案可以结合使用:开发环境用代理,生产环境用CORS。
连接数据库:让接口的数据活起来
接口返回硬编码的数据没有实际意义,真实场景中数据存储在数据库中,node项目常用MySQL和MongoDB两种,这里以MySQL为例。
mysql2模块的使用
安装依赖:
npm install mysql2
建立连接并查询数据:
const mysql = require('mysql2/promise');
// 创建连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'test_db',
waitForConnections: true
});
// 接口查询数据库
app.get('/api/users', async (req, res) => {
try {
const [rows] = await pool.query('SELECT id, name, age FROM users');
res.json({ code: 0, data: rows });
} catch (err) {
console.error(err);
res.status(500).json({ code: 1, msg: '服务器内部错误' });
}
});
关键点: 数据库密码不要硬编码在代码里,通过环境变量process.env.DB_PASSWORD读取。
接口安全验证:token机制怎么做
接口不能裸奔,需要有身份验证机制,最常用的是JWT(JSON Web Token)方案。
给接口加JWT验证
安装依赖:
npm install jsonwebtoken
登录成功后签发token:
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your_secret_key';
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
// 验证用户名密码(略),登录成功后签发token
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '2h' });
res.json({ code: 0, token, msg: '登录成功' });
});
受保护的接口校验token:
// 封装鉴权中间件
function authMiddleware(req, res, next) {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) return res.status(401).json({ code: 1, msg: '未提供token' });
try {
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded;
next();
} catch (err) {
res.status(401).json({ code: 1, msg: 'token无效或过期' });
}
}
app.get('/api/profile', authMiddleware, (req, res) => {
res.json({ code: 0, data: { username: req.user.username, msg: '身份验证通过' } });
});
接口的调试、日志与线上部署
调试技巧
- 用Postman或Apifox调试接口,比浏览器地址栏更专业,能设置请求头、请求体,还能保存历史记录。
- 用
nodemon启动服务,修改代码后自动重启,不需要手动Ctrl+C再重启。
npm install -g nodemon nodemon server.js
端口与进程管理
服务器上不能让node进程直接裸跑,需要进程守护工具,比较常用的有PM2:
npm install -g pm2 pm2 start server.js --name my-api pm2 save # 保存进程列表,开机自启 pm2 logs # 查看运行日志
部署时注意的细节
- 设置环境变量
NODE_ENV=production,Express会启用生产模式优化。 - 用Nginx做反向代理,将
/api路径转发到node端口,静态资源交给Nginx处理。 - 服务器防火墙只开放80/443端口,内部端口不暴露。
接口开发常见问题排查
接口返回404。 检查路由路径是否匹配,是否需要加/api前缀,路径参数是否写对(比如id写成了id)。
请求日志能看到200,但前端报错。 多半是跨域响应头缺失,或是返回的数据结构前端解析不了,前后端约定好统一的JSON结构。
并发量大时接口响应变慢。 检查是否有慢查询,看数据库索引是否命中,接口中是否有阻塞主线程的同步操作。
接口数量多了之后怎么做
接口数量达到几十个时,把所有路由写在一个文件里比较混乱,可以用express.Router()拆分模块:
// routes/user.js
const router = express.Router();
router.get('/list', ...); // 路径对应 /api/user/list
router.post('/add', ...);
module.exports = router;
// app.js 执行挂载
app.use('/api/user', require('./routes/user'));
Q&A:node接口开发常见疑问解答
node写的接口和java写的接口有什么本质区别吗?
功能上没有区别,都是HTTP服务,区别在于生态和适用场景,Java的Spring Boot框架体系成熟,适合大型分布式系统,Node.js的Express轻量灵活,开发效率更高,在中小型项目、前后端分离场景中比较常用,据统计,国内相当一部分互联网公司的内部工具和小型业务接口由Node.js承担。
node怎么自己写接口,不借助框架能不能做?
可以,用原生http模块就能实现,但框架帮你处理了路由分发、中间件机制、请求体解析等通用逻辑,如果一个项目只有一两个接口,原生写法没问题;接口数量增多之后,框架能减少不少重复代码。
node接口怎么保证安全?
核心有几点:接口加token验证(JWT)、数据库参数化查询(防止SQL注入)、设置CORS白名单(限制来源)、通过HTTPS加密传输、敏感数据(密码等)使用加盐哈希存储,另外建议在接口层做频率限制,防止恶意请求刷接口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/784177.html


