# 应用对象和启动流程

URL: https://caijiao.org/koa/core/app
Source: docs/koa/core/app.md
Description: 了解 Koa 应用对象的作用以及应用的启动流程，包括如何创建 Koa 实例、配置中间件和启动服务器等核心步骤。

Koa 的应用对象 (`app`) 是所有 [Koa](/koa/) 应用的核心，它负责管理请求和响应的流转，并配置应用的中间件和路由。理解 Koa 应用对象及其启动流程，对于顺利搭建一个高效的 Node.js 应用至关重要。

## 1. 创建应用对象

在 Koa 中，应用对象是通过实例化 `Koa` 类来创建的。它提供了各种方法来处理请求和响应、注册中间件等。

### 示例

```js
const Koa = require('koa');
const app = new Koa();
````

通过这行代码，我们创建了一个新的 Koa 应用对象 `app`。所有后续的操作，比如配置中间件、路由、错误处理等，都需要通过这个 `app` 对象来完成。

## 2. 配置中间件

Koa 采用中间件机制处理请求和响应，每个中间件函数都可以对请求做处理，或者在继续传递请求时做某些操作。

Koa 中间件通常通过 `app.use()` 方法进行注册。每个中间件会在请求到达路由前、路由后、以及响应发回客户端前被执行。

### 示例

```js
app.use(async (ctx, next) => {
  console.log('Request received');
  await next();  // 调用下一个中间件
});
```

这里的 `app.use()` 注册了一个中间件，该中间件会在每个请求到来时输出日志，并调用 `next()` 继续传递请求。

## 3. 启动服务器

在 Koa 中，启动服务器是通过调用应用对象的 `listen()` 方法来实现的。这个方法会让应用开始监听指定的端口，接收来自客户端的 HTTP 请求。

### 示例

```js
app.listen(3000, () => {
  console.log('Server running at http://localhost:3000');
});
```

在这个例子中，`app.listen(3000)` 启动了一个 HTTP 服务器，监听本地 3000 端口，并输出一条日志提示服务已启动。

### 完整示例

```js
const Koa = require('koa');
const app = new Koa();

// 中间件
app.use(async (ctx, next) => {
  console.log('Request received');
  await next();
  console.log('Response sent');
});

app.use(async (ctx) => {
  ctx.body = 'Hello, Koa!';
});

// 启动服务器
app.listen(3000, () => {
  console.log('Server running at http://localhost:3000');
});
```

此示例中，Koa 应用首先处理请求，在日志中记录请求接收和响应发送，最终返回 `Hello, Koa!` 给客户端。

## 4. 启动流程解析

Koa 的启动流程大致可以分为以下几个步骤：

1. **创建 Koa 实例**：首先通过 `const app = new Koa()` 创建应用对象。
2. **注册中间件**：通过 `app.use()` 注册中间件，这些中间件会按顺序处理每个 HTTP 请求。
3. **启动服务器**：调用 `app.listen()` 启动服务器，监听指定的端口，接收来自客户端的请求。

每个请求进入应用时，都会按照中间件的注册顺序依次经过，直到某个中间件完成请求的处理，或者请求到达终端响应。

## 5. 应用对象的其他常用方法

除了 `use()` 和 `listen()` 方法外，Koa 应用对象还提供了一些常用的方法，用于配置和管理应用：

### `.context`

`ctx` 是 Koa 中的上下文对象，它代表了每个请求的状态信息。在应用中，`ctx` 对象有很多用于处理请求和响应的属性。

### `.on()`

`app.on()` 可以用于监听应用级别的事件，例如错误事件。

```js
app.on('error', (err, ctx) => {
  console.error('Server Error', err, ctx);
});
```

### `.keys`

`app.keys` 用于设置密钥，用于签名和验证应用中的 cookies。它是 Koa 用于 Cookie 安全机制的部分。

```js
app.keys = ['some secret', 'another secret'];
```

## 6. 总结

Koa 的应用对象是应用程序的核心，它管理着请求和响应的流转，并通过中间件的方式实现灵活的功能扩展。通过创建应用对象、注册中间件、启动服务器等步骤，你可以快速构建并启动一个 Koa 应用。掌握 Koa 应用对象和启动流程，是开发高效 Node.js 应用的基础。
