Skip to content

Claude Code 实战

本章从打开终端到跑通一个完整的 Todo REST API,全程由 Claude Code + DeepSeek V4 驱动。

Claude Code + DeepSeek V4 配置参考:Claude Code DeepSeek 配置

先来看下 Claude Code 的基本操作界面和日常高频命令。

启动你的第一个 Claude Code 会话

打开终端,进入任意一个工作目录(或新建一个空文件夹),然后输入:

bash
$ mkdir runoob-todo-api
$ cd runoob-todo-api
$ claude

首次启动会看到欢迎界面和版本信息以及 DeepSeek 的环境变量配置。

runoob1779254890182.png

如果不确定配置是否生效,进入后立刻输入 /status,确认 Base URL 指向的是 https://api.deepseek.com/anthropic

常用斜杠命令速查表

在 Claude Code 的对话框中,以 / 开头的是内置命令,不会发送给模型。

命令作用
/status查看当前模型、Base URL、会话统计
/help显示所有可用命令
/clear清除当前对话上下文(不删除文件)
/exit 或 Ctrl+C退出 Claude Code
/undo撤销上一次文件修改
/diff查看最近一次修改的 git diff

权限提示机制

当 Claude Code 准备写入文件、执行命令时,它会先暂停,列出将要做的操作,等待你确认。

这是 Claude Code 最重要的安全机制,初学者不必担心 AI 失控乱改。

你会看到类似这样的提示:

bash
┌─────────────────────────────────────────────────┐
  Claude wants to create the following files:

 src/index.js
 src/routes/todos.js
 package.json

  Allow? [Y/n]                                    │
└─────────────────────────────────────────────────┘

直接按 Enter 或输入 y 确认,输入 n 跳过。


实战项目:用 AI 从零搭一个 Todo API

本节带你用自然语言驱动 Claude Code,从零生成一个可运行的 Node.js REST API。

项目目标

我们要搭建一个具备以下功能的 REST API:

接口功能
GET /todos获取所有待办事项
POST /todos创建新待办事项
PUT /todos/:id更新待办事项(标记完成/修改内容)
DELETE /todos/:id删除待办事项

技术栈:Node.js + Express,数据暂存于内存(不需要数据库,降低复杂度)。

步骤 1:用自然语言描述需求

在 Claude Code 的对话框中输入以下内容(直接复制粘贴即可):

bash
请帮我从零创建一个 Node.js + Express Todo REST API 项目。

要求:
- 支持 GET /todos、POST /todos、PUT /todos/:id、DELETE /todos/:id 四个接口
- 数据先存在内存数组里,不需要数据库
- 每个 todo 包含:id、title、completed(布尔值)、createdAt 字段
- 请求和响应都使用 JSON 格式
- 加上基础的错误处理(404、400 等)
- 生成一份 README.md,说明如何启动和测试接口

项目结构建议:
my-todo-api/
├── src/
   ├── index.js       # 入口文件
   └── routes/
       └── todos.js   # Todo 路由
├── package.json
└── README.md

runoob1779255024375.png

写好提示词的三个要素:上下文(告诉 AI 技术栈和项目背景)、约束(明确你不想要什么)、期望输出(给出具体的文件结构或格式要求)。

步骤 2:Claude Code 生成文件结构

确认权限后,Claude Code 会依次创建以下文件。

生成过程中,有很多权限确认,一般直接选 Yes 就好了:

runoob1779255121552.png

成功后,会有如下信息输出,包含生成的内容,启动信息等,非常详细:

runoob1779255283065.png

查看下生成的项目结构:

runoob1779255669956.png

package.json

实例

json

{

  "name": "my-todo-api",

  "version": "1.0.0",

  "description": "A simple Todo REST API built with Express",

  "main": "src/index.js",

  "scripts": {

    "start": "node src/index.js",

    "dev": "nodemon src/index.js"

  },

  "dependencies": {

    "express": "^4.18.2"

  },

  "devDependencies": {

    "nodemon": "^3.0.1"

  }

}

src/index.js(入口文件)

实例

javascript

// 文件路径:src/index.js

// Todo API 入口文件,负责 Express 应用配置和启动

const express = require('express');

const todosRouter = require('./routes/todos');

const app = express();

// 端口号:优先使用环境变量 PORT,默认 3000

const PORT = process.env.PORT || 3000;

// 中间件:解析 JSON 请求体(必填,否则 req.body 为 undefined)

app.use(express.json());

// 注册 Todo 路由,所有 /todos 路径的请求由 todosRouter 处理

app.use('/todos', todosRouter);

// 根路径:返回欢迎信息和版本号

app.get('/', (req, res) => {

  res.json({ message: 'Todo API is running!', version: '1.0.0' });

});

// 全局错误处理中间件(必填,捕获未处理的异常)

app.use((err, req, res, next) => {

  console.error(err.stack);

  res.status(500).json({ error: 'Internal Server Error' });

});

// 启动 HTTP 服务

app.listen(PORT, () => {

  console.log(`Server is running on http://localhost:${PORT}`);

});

src/routes/todos.js(核心路由文件)

实例

javascript

// 文件路径:src/routes/todos.js

// Todo 路由模块,包含完整的 CRUD 业务逻辑

const express = require('express');

const router = express.Router();

// 内存存储:使用数组模拟数据库

// 服务重启后数据会丢失,后续可替换为 SQLite 等持久化方案

let todos = [];

// 自增 ID 计数器

let nextId = 1;

// GET /todos — 获取所有待办事项

router.get('/', (req, res) => {

  res.json(todos);

});

// POST /todos — 创建新待办事项

router.post('/', (req, res) => {

  const { title } = req.body;

  // 参数校验:title 为必填字段,类型必须为字符串且不为空

  if (!title || typeof title !== 'string' || title.trim() === '') {

    return res.status(400).json({ error: 'title 字段不能为空' });

  }

  // 构建新 todo 对象

  const newTodo = {

    id: nextId++,                         // 自增 ID

    title: title.trim(),                   // 去除首尾空格

    completed: false,                      // 新创建的 todo 默认未完成

    createdAt: new Date().toISOString(),   // ISO 8601 格式时间戳

  };

  todos.push(newTodo);

  // 201 Created 表示资源创建成功

  res.status(201).json(newTodo);

});

// PUT /todos/:id — 更新待办事项

router.put('/:id', (req, res) => {

  // 将路径参数从字符串转为数字

  const id = parseInt(req.params.id);

  const todo = todos.find(t => t.id === id);

  // 404:资源不存在

  if (!todo) {

    return res.status(404).json({ error: `未找到 id 为 ${id} 的待办事项` });

  }

  const { title, completed } = req.body;

  // 仅更新传入的字段,未传入的保持原值

  if (title !== undefined) todo.title = title.trim();

  // Boolean() 确保 completed 始终为布尔类型

  if (completed !== undefined) todo.completed = Boolean(completed);

  res.json(todo);

});

// DELETE /todos/:id — 删除待办事项

router.delete('/:id', (req, res) => {

  const id = parseInt(req.params.id);

  const index = todos.findIndex(t => t.id === id);

  if (index === -1) {

    return res.status(404).json({ error: `未找到 id 为 ${id} 的待办事项` });

  }

  // 从数组中移除指定位置的元素

  todos.splice(index, 1);

  // 204 No Content 表示删除成功,响应体为空

  res.status(204).send();

});

module.exports = router;

步骤 3:审查并确认修改

Claude Code 生成代码后,不要急着直接运行,养成审查习惯。

你可以在对话中继续追问:

bash
你帮我生成的代码我看了一下,有几个问题想确认:
1. POST /todos 时,如果 title 是数字类型会怎么处理?
2. PUT 接口能同时更新 title completed 吗?
3. 有没有对 id 不是数字的情况做处理?

Claude Code 会逐一回答,并可以当场修正代码。

这种「生成 → 质疑 → 修正」的循环是与 AI 协作的核心节奏。

runoob1779255407485.png

步骤 4:安装依赖并启动服务

在 Claude Code 对话框中输入:

bash
请帮我安装依赖并启动项目,然后告诉我怎么用 curl 测试每个接口

Claude Code 会执行以下操作(每步都会请求你确认)。

安装依赖

bash
$ npm install

输出示例:

bash
added 64 packages in 2.3s

启动服务

bash
$ npm start

输出:

bash
Server is running on http://localhost:3000

测试命令

新开一个终端窗口,依次运行以下 curl 命令:

bash
# 创建第一条 Todo
$ curl -X POST http://localhost:3000/todos \
  -H "Content-Type: application/json" \
  -d '{"title": "学习 Claude Code"}'

# 创建第二条 Todo
$ curl -X POST http://localhost:3000/todos \
  -H "Content-Type: application/json" \
  -d '{"title": "完成 DeepSeek 配置"}'

# 获取所有 Todos
$ curl http://localhost:3000/todos

# 把第一条标记为完成
$ curl -X PUT http://localhost:3000/todos/1 \
  -H "Content-Type: application/json" \
  -d '{"completed": true}'

# 删除第二条
$ curl -X DELETE http://localhost:3000/todos/2

# 再次查看列表,确认删除成功
$ curl http://localhost:3000/todos

预期输出(GET /todos 最终结果)

json
[
  {
    "id": 1,
    "title": "学习 Claude Code",
    "completed": true,
    "createdAt": "2026-05-20T10:30:00.000Z"
  }
]

恭喜,你的第一个 AI 辅助开发的 API 跑起来了。

进阶挑战:让 Claude Code 帮你加新功能

API 跑通之后,试着用自然语言让 Claude Code 扩展功能:

bash
请给 Todo API 加上以下功能:
1. GET /todos 支持 ?completed=true/false 的查询参数过滤
2. GET /todos 支持 ?sort=createdAt&order=desc 的排序参数
3. 同时更新 README.md 里的接口文档

观察 Claude Code 如何理解已有代码结构,精准地在正确位置插入新逻辑,而不是重写整个文件。

这正是它比普通代码生成工具强的地方。


CLAUDE.md:项目记忆文件

CLAUDE.md 是 Claude Code 的项目级记忆文件,让 AI 每次启动时自动了解项目规范。

为什么需要它

Claude Code 每次启动都是「全新的」——它不记得上次会话说过什么。

但如果项目根目录有一个 CLAUDE.md 文件,Claude Code 每次启动时会自动读取它,相当于给 AI 的「项目说明书」。

没有 CLAUDE.md 的痛点:

  • 每次都要重新解释「我们用 Express 不用 Koa」
  • AI 忘了你的命名规范,又生成了驼峰命名的文件
  • 团队成员各自和 AI 说不同的约定,代码风格混乱

CLAUDE.md 写法模板

在项目根目录创建 CLAUDE.md,内容参考以下模板:

bash
# 项目说明(CLAUDE.md)

## 项目概述
这是一个 Node.js + Express Todo REST API 项目。
当前阶段:数据存在内存中,下一步会迁移到 SQLite。

## 技术栈
- 运行时:Node.js 18+
- 框架:Express 4.x
- 测试:(暂无,后续加 Jest)
- 代码风格:ESLint + Prettier(配置见 .eslintrc)

## 目录结构
src/
├── index.js        # 入口,只做 app 配置和监听
└── routes/
    └── todos.js    # Todo 业务逻辑全在这里

## 命名规范
- 文件名:kebab-case(如 todo-service.js)
- 变量/函数:camelCase
- 常量:UPPER_SNAKE_CASE
- 路由文件按资源名命名(如 users.js、products.js)

## 重要约定
- 所有接口返回 JSON,错误统一格式:{ "error": "错误描述" }
- HTTP 状态码语义要准确:创建成功用 201,删除成功用 204
- 禁止在路由文件里直接操作数据库(现在是内存数组,将来是 DB)
- 每个路由文件只处理一种资源

## 禁止事项
- 不要用 var,只用 const/let
- 不要用回调风格,统一用 async/await
- 不要在代码里写中文注释(英文注释即可)
- 不要安装 lodash,原生 JS 方法够用

## 启动方式
npm start          # 生产模式
npm run dev        # 开发模式(nodemon 热重载)

## 测试接口
 README.md curl 示例

让 Claude Code 自动生成 CLAUDE.md

不想手写?直接让 AI 帮你生成:

bash
请根据当前项目的代码结构和我们的对话记录,
帮我生成一份 CLAUDE.md 文件,
内容包括项目概述、技术栈、目录结构、命名规范和重要约定。

Claude Code 会分析所有已生成的文件,自动整理出适合本项目的 CLAUDE.md。

CLAUDE.md 的维护节奏

时机要做的事
引入新依赖更新「技术栈」部分
修改文件结构更新「目录结构」部分
制定新的编码规范追加到「重要约定」
发现 AI 反复犯同一个错加入「禁止事项」

把 CLAUDE.md 提交到 Git,团队所有成员和 AI 就共享同一份规范。

这是 AI 辅助团队协作的基础设施。


本章小结

你学会了什么对应内容
启动 Claude Code 并确认 DeepSeek 配置启动会话与 /status
用三要素提示词描述需求步骤 1:自然语言描述
审查 AI 生成的代码步骤 3:审查与质疑
安装依赖、启动并用 curl 测试接口步骤 4:运行与测试
用 CLAUDE.md 管理项目记忆CLAUDE.md 配置

AI 思考中...

Claude Code 与 remotion-best-practices 制作视频

Claude Code 使用字节方舟 Coding Plan

基于 VitePress 构建,部署于 GitHub Pages