Commit 7a3481d9 authored by xiezhi's avatar xiezhi

Initial commit: Node.js 18 Hello World HTTP Server template

- 基于Node.js 18的HTTP服务器模板
- 支持环境变量配置端口
- 包含完整的Makefile自动化脚本
- 支持Docker容器化部署
- 包含VSCode调试配置
- 支持Eazy平台部署配置
parents
{
"version": "1.0.0",
"name": "Node.js 18 Hello World",
"tags": ["nodejs", "hello-world", "http-server", "node18"],
"description": "基于Node.js 18的Hello World HTTP服务器示例",
"init_commands": ["make install"],
"start_commands": ["make run"],
"stop_commands": ["make stop"],
"mapping_ports": {
"APP_PORT_1": 8080,
"APP_PORT_2": 8081,
"APP_PORT_3": 8082,
"APP_PORT_4": 8083
},
"deploy": [
{
"image_name": "node18-hello-world",
"app_access_entry": true,
"ports": [
{
"name": "APP_PORT_1",
"main_port": true,
"inner_access_env_key": "API_URL",
"open_access": true,
"open_access_env_key": "API_DOMAIN"
},
{
"name": "APP_PORT_2",
"main_port": false,
"inner_access_env_key": null,
"open_access": false,
"open_access_env_key": null
}
],
"docker_file_dir": "./",
"deploy_resources": {
"cpu_limit": 0.5,
"memory_limit": 1,
"storage_limit": 1
}
}
]
}
# 依赖文件
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# 环境变量文件
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# 构建输出
dist/
build/
out/
# 日志文件
*.log
# 运行时数据
pids
*.pid
*.seed
*.pid.lock
# 覆盖率目录
coverage/
.nyc_output
# 依赖目录
jspm_packages/
# 可选的npm缓存目录
.npm
# 可选的eslint缓存
.eslintcache
# 可选的REPL历史
.node_repl_history
# 输出目录
*.tgz
# Yarn完整性文件
.yarn-integrity
# dotenv环境变量文件
.env
# 编辑器目录和文件
.idea/
*.swp
*.swo
*~
# 操作系统生成的文件
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# 临时文件
*.tmp
*.temp
# 备份文件
*.bak
*.backup
{
"recommendations": [
"ms-vscode.vscode-node-azure-pack",
"ms-vscode.vscode-typescript-next",
"bradlc.vscode-tailwindcss",
"esbenp.prettier-vscode",
"ms-vscode.vscode-eslint",
"formulahendry.code-runner",
"editorconfig.editorconfig",
"ms-vscode.vscode-json"
]
}
\ No newline at end of file
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"name": "Debug Node.js App",
"request": "launch",
"program": "${workspaceFolder}/hello_world.js",
"console": "integratedTerminal",
"stopOnEntry": false,
"env": {
"APP_PORT_1": "8080"
},
"runtimeArgs": []
},
{
"type": "node",
"name": "Debug Current File",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"stopOnEntry": false,
"env": {
"APP_PORT_1": "8080"
}
}
]
}
# 使用Node.js 18作为基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json文件
COPY package.json ./
# 安装依赖(如果有的话)
RUN npm install
# 复制源代码
COPY hello_world.js ./
# 复制Makefile和启动脚本
COPY Makefile ./
COPY docker-entrypoint.sh ./
# 设置启动脚本权限
RUN chmod +x docker-entrypoint.sh
# 设置环境变量
ENV APP_PORT_1=8080
# 暴露端口
EXPOSE $APP_PORT_1
# 运行程序
ENTRYPOINT ["./docker-entrypoint.sh"]
# 变量定义
APP_NAME = node18-hello-world
NODE_VERSION = 18
MAIN_FILE = hello_world.js
APP_PORT = $(or $(APP_PORT_1),8080)
LOG_FILE = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/app.log
PID_FILE = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/app.pid
# Node.js命令
NODE = node
NPM = npm
# 默认目标
.PHONY: all
all: install
# 安装命令
.PHONY: install
install:
@echo "检查 Node.js 版本..."
@$(NODE) --version
@echo "检查项目依赖..."
@if [ -f "package.json" ]; then \
echo "安装npm依赖..."; \
$(NPM) install; \
echo "✅ npm依赖安装完成"; \
else \
echo "✅ 无需安装依赖"; \
fi
@echo "✅ 安装完成!Node.js项目已准备就绪"
# 运行命令(后台运行HTTP服务器)
.PHONY: run
run: install
@echo "正在启动 Node.js HTTP 服务器..."
@mkdir -p $(dir $(LOG_FILE))
@if [ -f "$(PID_FILE)" ]; then \
echo "服务器已在运行中,PID: $$(cat $(PID_FILE))"; \
exit 1; \
fi
@echo "启动服务器在端口 $(APP_PORT)..."
@APP_PORT_1=$(APP_PORT) nohup $(NODE) $(MAIN_FILE) > $(LOG_FILE) 2>&1 & echo $$! > $(PID_FILE)
@echo "✅ Node.js HTTP 服务器已启动,PID: $$(cat $(PID_FILE))"
@echo "服务器运行在: http://localhost:$(APP_PORT)/"
@echo "查看日志: tail -f $(LOG_FILE)"
# 停止命令
.PHONY: stop
stop: kill
# 强制杀死所有相关Node.js进程
.PHONY: kill
kill:
@echo "正在查找并杀死所有相关的Node.js进程..."
@PIDS=$$(ps aux | grep -E "node.*$(MAIN_FILE)|node.*$(APP_NAME)" | grep -v grep | awk '{print $$2}'); \
if [ -n "$$PIDS" ]; then \
echo "找到相关进程: $$PIDS"; \
for PID in $$PIDS; do \
echo "正在杀死进程 $$PID..."; \
kill -9 $$PID 2>/dev/null || true; \
done; \
sleep 1; \
echo "✅ 所有相关Node.js进程已被强制停止"; \
else \
echo "未找到相关的Node.js进程"; \
fi
@rm -f $(PID_FILE)
@echo "✅ 强制停止操作完成"
# 重启命令
.PHONY: restart
restart: stop run
# 查看状态
.PHONY: status
status:
@if [ -f "$(PID_FILE)" ]; then \
PID=$$(cat $(PID_FILE)); \
if ps -p $$PID > /dev/null 2>&1; then \
echo "✅ 服务器正在运行,PID: $$PID"; \
echo "端口: $(APP_PORT)"; \
echo "日志: $(LOG_FILE)"; \
else \
echo "❌ 服务器未运行(PID文件存在但进程不存在)"; \
rm -f $(PID_FILE); \
fi; \
else \
echo "❌ 服务器未运行"; \
fi
# 直接运行(前台运行)
.PHONY: dev
dev: install
@echo "直接运行 Node.js HTTP 服务器(前台模式)..."
@echo "服务器将在端口 $(APP_PORT) 上运行"
@echo "按 Ctrl+C 停止服务器"
@APP_PORT_1=$(APP_PORT) $(NODE) $(MAIN_FILE)
# 清理文件
.PHONY: clean
clean:
@echo "清理文件..."
rm -rf node_modules
rm -rf .logs
@echo "清理完成!"
# 显示帮助信息
.PHONY: help
help:
@echo "Node.js 18 HTTP 服务器项目"
@echo ""
@echo "可用命令:"
@echo " make install - 安装依赖并准备项目"
@echo " make run - 启动HTTP服务器(后台运行)"
@echo " make dev - 直接运行HTTP服务器(前台模式)"
@echo " make stop - 停止HTTP服务器(优雅停止)"
@echo " make kill - 强制杀死所有相关Node.js进程"
@echo " make restart - 重启HTTP服务器"
@echo " make status - 查看服务器状态"
@echo " make clean - 清理文件"
@echo " make help - 显示此帮助信息"
@echo ""
@echo "示例:"
@echo " make run # 启动服务器(后台)"
@echo " make dev # 启动服务器(前台)"
@echo " make status # 查看状态"
@echo " make stop # 优雅停止服务器"
@echo " make kill # 强制停止所有相关进程"
@echo " make restart # 重启服务器"
@echo ""
@echo "环境变量:"
@echo " APP_PORT_1 - 服务器端口(默认: 8080)"
# Node.js 18 HTTP 服务器项目
这是一个使用Node.js 18编写的简单HTTP服务器示例,展示了基本的Node.js网络编程和HTTP服务实现。
## 项目结构
```
node18-template/
├── hello_world.js # 主程序文件
├── package.json # Node.js项目配置
├── Dockerfile # Docker容器化配置
├── docker-entrypoint.sh # Docker启动脚本
├── Makefile # 编译和运行脚本
└── README.md # 项目说明文档
```
## 功能特性
- ✅ 基于Node.js 18的HTTP服务器
- ✅ 使用内置的http模块
- ✅ 支持环境变量配置端口
- ✅ 返回"Hello World!"响应
- ✅ Makefile自动化运行和管理
- ✅ 支持后台运行和进程管理
- ✅ Docker容器化支持
## 环境要求
- Node.js 18 或更高版本
- npm(Node.js包管理器)
- Make工具(可选,用于自动化构建)
- Docker(可选,用于容器化运行)
## 快速开始
### 方法一:直接运行
```bash
# 直接运行HTTP服务器
node hello_world.js
# 或者使用npm
npm start
```
### 方法二:使用Makefile
```bash
# 安装依赖并准备项目
make install
# 启动HTTP服务器(后台运行)
make run
# 直接运行HTTP服务器(前台模式)
make dev
# 查看服务器状态
make status
# 停止服务器
make stop
# 强制停止所有相关进程
make kill
# 重启服务器
make restart
# 清理文件
make clean
# 查看帮助
make help
```
### 方法三:使用Docker
```bash
# 构建Docker镜像
docker build -t node18-hello-world .
# 运行容器
docker run -p 8080:8080 node18-hello-world
# 运行容器并指定端口
docker run -p 9090:8080 -e APP_PORT_1=8080 node18-hello-world
```
## 服务器使用示例
### 启动服务器
```bash
make run
# 输出:
# ✅ Node.js HTTP 服务器已启动,PID: 12345
# 服务器运行在: http://localhost:8080/
```
### 访问服务器
```bash
curl http://localhost:8080/
# 输出:Hello World!
```
### 查看服务器状态
```bash
make status
# 输出:
# ✅ 服务器正在运行,PID: 12345
# 端口: 8080
# 日志: /path/to/.logs/app.log
```
### 停止服务器
```bash
make stop
# 输出:
# ✅ 进程 12345 已被强制停止
# ✅ 服务器停止操作完成
```
## 代码说明
### hello_world.js
HTTP服务器类包含以下功能:
- **http模块**: 使用Node.js内置的http模块创建HTTP服务器
- **端口配置**: 监听8080端口
- **请求处理**: 处理所有HTTP请求并返回"Hello World!"响应
- **服务器启动**: 启动HTTP服务器并输出运行信息
### package.json
Node.js项目配置文件:
- **项目信息**: 定义项目名称、版本、描述等
- **脚本命令**: 定义start、dev等npm脚本
- **引擎要求**: 指定Node.js版本要求(>=18.0.0)
### Makefile
提供了以下命令:
- `install`: 检查Node.js版本并安装依赖
- `run`: 启动HTTP服务器(后台运行)
- `dev`: 直接运行HTTP服务器(前台模式)
- `stop`: 停止HTTP服务器(直接调用kill)
- `kill`: 强制停止所有相关Node.js进程
- `restart`: 重启HTTP服务器
- `status`: 查看服务器运行状态
- `clean`: 清理生成的文件
- `help`: 显示帮助信息
### Dockerfile
- 基于Node.js 18 Alpine镜像
- 自动安装依赖和运行HTTP服务器
- 支持端口配置(APP_PORT_1环境变量)
- 暴露8080端口
## 环境变量
- `APP_PORT_1`: HTTP服务器端口号(默认: 8080)
## 扩展建议
1. **添加更多路由**: 可以添加不同的URL路径处理
2. **静态文件服务**: 添加静态文件(HTML、CSS、JS)服务功能
3. **API接口**: 添加RESTful API接口
4. **日志记录**: 使用winston或pino进行日志记录
5. **配置文件**: 添加JSON或YAML配置文件支持
6. **Express框架**: 使用Express.js框架简化开发
7. **健康检查**: 添加健康检查端点
8. **HTTPS支持**: 添加SSL/TLS支持
9. **中间件**: 添加请求日志、错误处理等中间件
10. **数据库集成**: 添加数据库连接和操作
## 许可证
此项目仅用于学习和演示目的。
#!/bin/bash
# Node.js 18 HTTP 服务器容器启动脚本
set -e
echo "=== Node.js 18 HTTP 服务器容器启动 ==="
echo "Node.js版本: $(node --version)"
echo "工作目录: $(pwd)"
echo "端口: ${APP_PORT_1:-8080}"
echo ""
# 检查Node.js是否可用
if ! command -v node &> /dev/null; then
echo "错误: Node.js未安装或不在PATH中"
exit 1
fi
# 检查主文件是否存在
if [ ! -f "hello_world.js" ]; then
echo "错误: hello_world.js文件不存在"
exit 1
fi
# 安装依赖(如果有package.json)
if [ -f "package.json" ]; then
echo "安装npm依赖..."
npm install
fi
# 运行HTTP服务器
echo "启动HTTP服务器..."
echo "服务器将在端口 ${APP_PORT_1:-8080} 上运行"
echo "=========================================="
exec node hello_world.js
/**
* Node.js 18 HTTP 服务器
* 一个简单的HTTP服务器,返回"Hello World!"响应
*/
var http = require('http');
// 从环境变量获取端口号,默认为8080
var port = process.env.APP_PORT_1 || 8080;
/**
* 创建HTTP服务器
* @param {Object} req - HTTP请求对象
* @param {Object} res - HTTP响应对象
*/
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Hello World!');
}).listen(port, () => {
console.log('Server running at http://0.0.0.0:' + port + '/');
});
{
"name": "node18-hello-world",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "node18-hello-world",
"version": "1.0.0",
"license": "MIT",
"engines": {
"node": ">=18.0.0"
}
}
}
}
{
"name": "node18-hello-world",
"version": "1.0.0",
"description": "Node.js 18 HTTP 服务器示例",
"main": "hello_world.js",
"scripts": {
"start": "node hello_world.js",
"dev": "node hello_world.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"nodejs",
"http",
"server",
"hello-world"
],
"author": "",
"license": "MIT",
"engines": {
"node": ">=18.0.0"
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment