Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它让 JavaScript 能够在服务器端运行,从而可以用来搭建高性能的网络服务器,相比于传统的服务器端语言(如 PHP、Java、Python),Node.js 的非阻塞 I/O 模型和事件驱动机制使其特别适合处理高并发、低延迟的场景,比如实时聊天、在线游戏、API 服务等,下面将详细介绍如何使用 Node.js 搭建一个基本的服务器,包括环境准备、代码实现、功能扩展和部署优化等内容。

环境准备:安装 Node.js 和 npm
在开始搭建服务器之前,需要先安装 Node.js 运行环境,Node.js 官网(https://nodejs.org/)提供了 Windows、macOS 和 Linux 等多个系统的安装包,下载对应系统的 LTS(长期支持)版本即可完成安装,安装完成后,打开终端(命令提示符或 PowerShell),输入以下命令验证是否安装成功:
node -v # 查看 Node.js 版本 npm -v # 查看 npm(Node Package Manager)版本
如果显示版本号,说明安装成功,npm 是 Node.js 的包管理工具,用于安装和管理项目依赖,后续我们会通过 npm 初始化项目并安装必要的模块。
创建项目并初始化服务器
初始化项目
在本地创建一个文件夹(如 my-server),进入该文件夹,通过终端执行以下命令初始化 Node.js 项目:
npm init -y
该命令会生成一个 package.json 文件,用于记录项目的基本信息和依赖包,如果需要手动配置,可以去掉 -y 参数,根据提示填写项目名称、版本、描述等信息。

编写服务器代码
在项目根目录下创建一个 server.js 文件(文件名可自定义),使用 Node.js 内置的 http 模块创建一个简单的 HTTP 服务器,以下是基础代码示例:
// 1. 引入 http 模块
const http = require('http');
// 2. 创建服务器
const server = http.createServer((req, res) => {
// 设置响应头,指定内容类型为 HTML
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
// 返回响应内容
res.end('<h1>欢迎使用 Node.js 服务器!</h1><p>当前时间:' + new Date().toLocaleString() + '</p>');
});
// 3. 启动服务器,监听指定端口(如 3000)
const PORT = 3000;
server.listen(PORT, () => {
console.log(`服务器已启动,访问 http://localhost:${PORT}`);
});
运行服务器
在终端中执行以下命令启动服务器:
node server.js
如果看到终端输出“服务器已启动,访问 http://localhost:3000”,说明服务器运行成功,打开浏览器,访问 http://localhost:3000,即可看到页面显示的欢迎信息和当前时间。
扩展服务器功能:路由处理与静态文件服务
基础的 HTTP 服务器只能处理所有请求的相同响应,实际应用中需要根据不同的 URL 路径返回不同的内容(路由处理),并支持访问静态文件(如 HTML、CSS、图片等),我们可以通过 url 和 fs 模块实现这些功能。
路由处理
使用 url 模块解析请求的路径,根据路径返回不同的响应内容。
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const path = parsedUrl.pathname;
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
if (path === '/' || path === '/home') {
res.end('<h1>首页</h1><p>欢迎访问首页!</p>');
} else if (path === '/about') {
res.end('<h1>关于我们</h1><p>这是一个基于 Node.js 的示例服务器。</p>');
} else if (path === '/contact') {
res.end('<h1>联系我们</h1><p>邮箱:example@example.com</p>');
} else {
res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
res.end('<h1>404 页面未找到</h1><p>抱歉,您访问的页面不存在。</p>');
}
});
server.listen(3000, () => {
console.log('服务器已启动,访问 http://localhost:3000');
});
静态文件服务
使用 fs 模块读取静态文件,并根据文件类型设置响应头,创建一个 public 文件夹,存放 index.html、style.css 等文件,然后修改服务器代码:
const http = require('http');
const fs = require('fs');
const path = require('path');
const server = http.createServer((req, res) => {
const filePath = path.join(__dirname, 'public', req.url === '/' ? 'index.html' : req.url);
// 获取文件扩展名,设置对应的 Content-Type
const extname = path.extname(filePath);
const mimeTypes = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'text/javascript',
'.png': 'image/png',
'.jpg': 'image/jpeg',
};
const contentType = mimeTypes[extname] || 'application/octet-stream';
fs.readFile(filePath, (err, content) => {
if (err) {
if (err.code === 'ENOENT') {
// 文件不存在,返回 404
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end('<h1>404 页面未找到</h1>');
} else {
// 服务器错误
res.writeHead(500);
res.end('服务器错误:' + err.code);
}
} else {
res.writeHead(200, { 'Content-Type': contentType });
res.end(content);
}
});
});
server.listen(3000, () => {
console.log('服务器已启动,访问 http://localhost:3000');
});
这样,服务器就能根据请求路径返回 public 文件夹中的静态文件,例如访问 http://localhost:3000/style.css 会返回 CSS 文件内容。
使用 Express 框架简化开发
虽然 Node.js 内置的 http 模块可以搭建服务器,但实际开发中更常使用第三方框架(如 Express),它提供了更简洁的 API,支持路由、中间件、模板引擎等功能,能大幅提高开发效率。
安装 Express
在项目终端中执行以下命令安装 Express:
npm install express
使用 Express 重写服务器
创建 app.js 文件,使用 Express 搭建服务器:
const express = require('express');
const path = require('path');
const app = express();
const PORT = 3000;
// 静态文件服务:public 文件夹下的文件可通过 URL 直接访问
app.use(express.static(path.join(__dirname, 'public')));
// 路由处理
app.get('/', (req, res) => {
res.send('<h1>Express 服务器</h1><p>欢迎使用 Express 框架!</p>');
});
app.get('/about', (req, res) => {
res.send('<h1>Express</h1><p>Express 是一个简洁的 Node.js Web 框架。</p>');
});
// 404 处理
app.use((req, res) => {
res.status(404).send('<h1>404 页面未找到</h1>');
});
app.listen(PORT, () => {
console.log(`Express 服务器已启动,访问 http://localhost:${PORT}`);
});
相比原生 http 模块,Express 的代码更简洁:express.static 中间件直接处理静态文件,app.get 方法定义路由,app.use 处理 404 错误,无需手动解析 URL 和设置响应头。
部署与优化
开发完成后,需要将服务器部署到生产环境,并进行性能优化,常见的部署方式包括使用 PM2(进程管理工具)、Nginx 反向代理等。
使用 PM2 管理进程
PM2 是一个流行的 Node.js 进程管理工具,可以保持服务器持续运行,支持集群模式、日志管理等功能,安装 PM2:
npm install -g pm2
启动服务器(假设入口文件为 app.js):
pm2 start app.js --name "my-server"
常用命令:
pm2 list:查看运行中的进程pm2 restart my-server:重启服务器pm2 stop my-server:停止服务器pm2 logs my-server:查看日志
Nginx 反向代理
Nginx 是一个高性能的 Web 服务器和反向代理工具,可以用于负载均衡、静态文件缓存、HTTPS 配置等,配置 Nginx 反向代理 Node.js 服务器(示例):
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:3000; # 代理到 Node.js 服务器
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
配置完成后,重启 Nginx,即可通过 yourdomain.com 访问 Node.js 服务器。
相关问答 FAQs
问题 1:Node.js 适合搭建什么类型的服务器?
解答:Node.js 适合搭建高并发、I/O 密集型的服务器,例如实时聊天应用(如 WebSocket 服务)、在线游戏、API 接口服务、流媒体服务等,其非阻塞 I/O 模型和事件驱动机制能有效处理大量并发请求,相比传统阻塞式 I/O 服务器(如 Apache)更具性能优势,但对于 CPU 密集型任务(如复杂计算、大数据处理),Node.js 可能不如多线程语言(如 Java、C++)高效,此时可通过多进程(如 PM2 集群模式)或结合其他语言优化。
问题 2:如何解决 Node.js 服务器跨域问题?
解答:跨域(CORS)是浏览器出于安全考虑对跨域请求的限制,可通过以下方式解决:
- 使用中间件:在 Express 中安装
cors中间件:npm install cors,然后在代码中配置:const cors = require('cors'); app.use(cors()); // 允许所有来源的跨域请求如果需要限制特定来源,可传入配置对象:
app.use(cors({ origin: 'https://example.com' })); - 手动设置响应头:在原生 Node.js 服务器中,通过
res.setHeader手动添加 CORS 头:res.writeHead(200, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE' });Access-Control-Allow-Origin指定允许的来源, 表示允许所有来源(生产环境建议指定具体域名)。
