如何用Node.js搭建一个HTTP服务器?

用Node.js搞个HTTP服务器,这事儿简单得有点不像话,但里面的门道其实不少。今天咱们不扯框架,就用最原始的核心模块http,从零搓一个能用的服务器出来。理解了这些,你再去看Express、Koa那些框架,感觉会完全不一样。

最最基础的版本,三五行代码就够。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.methodreq.url来路由请求。处理POST请求时要注意,req是可读流,你得监听dataend事件来收集请求体数据。这是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服务器的工作原理有肌肉记忆。下次当你的框架应用出问题时,你才知道该往底层哪个方向去排查。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容