用Node.js搞个HTTP服务器,这事儿简单得有点不像话,但里面的门道其实不少。今天咱们不扯框架,就用最原始的核心模块http,从零搓一个能用的服务器出来。理解了这些,你再去看Express、Koa那些框架,感觉会完全不一样。
![图片[1]-如何用Node.js搭建一个HTTP服务器?-速码派](http://www.sumapai.com/wp-content/uploads/2026/01/c96a83c16dd94062ab033444dd8fe37dtplv-tb4s082cfz-aigc_resize_1080_1080-1-1024x683.webp)
最最基础的版本,三五行代码就够。Node.js自带了http模块,你把它require进来,调用createServer方法,传个回调函数,这事儿就成了。
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Node.js!n');
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
保存成server.js,运行node server.js,打开浏览器访问http://localhost:3000,你就能看到那句问候了。这里的req是请求对象,res是响应对象。res.writeHead设置状态码和响应头,res.end发送响应体并结束这次请求。
但这只是个玩具。真正的服务器得处理不同的URL和方法。咱们加点逻辑,让它像个正经API。
const server = http.createServer((req, res) => {
const { method, url } = req;
if (method === 'GET' && url === '/users') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify([{ id: 1, name: 'Alice' }]));
return;
}
if (method === 'POST' && url === '/users') {
let body = '';
req.on('data', chunk => { body += chunk; });
req.on('end', () => {
const newUser = JSON.parse(body);
// 这里应该把newUser存到数据库
res.writeHead(201, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ id: 2, ...newUser }));
});
return;
}
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not Foundn');
});
你看,我们通过判断req.method和req.url来路由请求。处理POST请求时要注意,req是可读流,你得监听data和end事件来收集请求体数据。这是Node.js处理大块数据的标准方式。
光这样还不够。生产环境里,你得考虑错误处理。服务器对象本身可以监听error事件。
server.on('error', (err) => {
console.error('Server error:', err);
// 这里可以记录日志,或者优雅重启
});
另外,记得处理SIGINT(比如按Ctrl+C)和SIGTERM信号,让服务器能优雅关闭,把手头正在处理的请求完成再退出。
process.on('SIGTERM', () => {
server.close(() => {
console.log('Server gracefully closed');
});
});
用原生模块写,你能透彻地理解HTTP协议和Node.js的事件驱动模型。但这也暴露出问题:路由得自己用if-else堆,解析JSON体、处理CORS、静态文件服务都得手写。所以对于正经项目,大家还是会用Express这种框架,它把这些繁琐的中间件都封装好了。
但无论如何,自己动手搭一次这个“自行车”,会让你对Web服务器的工作原理有肌肉记忆。下次当你的框架应用出问题时,你才知道该往底层哪个方向去排查。



























暂无评论内容