# 初始化

在小程序端开始使用云能力前，需先调用 `wx.cloud.init` 方法完成云能力初始化（注意小程序需先开通云服务，开通的方法是点击工具栏左上角的 “云开发” 按钮）。

因此，如果要使用云能力，通常我们在小程序初始化时即调用这个方法。

### 小程序端初始化

`wx.cloud.init` 方法的定义如下：

```js
function init(options): void
```

`wx.cloud.init` 方法接受一个可选的 `options 参数`，方法没有返回值。方法只能调用一次，多次调用时只有第一次调用生效。

`options` 参数定义了云开发的默认配置，该配置会作为之后调用其他所有云 API 的默认配置，`options` 提供的可选配置如下：

| 字段| 数据类型 | 必填 | 默认值  | 说明  |
| --  | -- | -- | -- | --
| env | `string` \| `object` | 是 | | 后续 API 调用的默认环境配置，传入字符串形式的环境 ID 可以指定所有服务的默认环境，传入对象可以分别指定各个服务的默认环境，见下方详细定义 |
| traceUser | `boolean`  |  否  | `false`  | 是否在将用户访问记录到用户管理中，在控制台中可见 |

当 `env` 传入参数为对象时，可以指定各个服务的默认环境，可选字段如下：

| 字段| 数据类型 | 必填 | 默认值  | 说明  |
| --  | -- | -- | -- | --
| database | string | 否 | 空 | 数据库 API 默认环境配置 |
| storage | string | 否 | 空 | 存储 API 默认环境配置 |
| functions | string | 否 | 空 | 云函数 API 默认环境配置 |

**注意**：`env` 设置只会决定小程序端 API 调用的云环境，并不会决定云函数中的 API 调用的环境，在云函数中需要通过 `wx-server-sdk` 的 `init` 方法重新设置环境。

示例代码：

```js
wx.cloud.init({
  env: '环境ID'
})
```

### 云函数端初始化

`cloud.init` 方法的定义如下：

```js
function init(options): void
```

`cloud.init` 方法接受一个可选的 `options 参数`，方法没有返回值。方法只能调用一次，多次调用时只有第一次调用生效。

`options` 参数定义了云开发的默认配置，该配置会作为之后调用其他所有云 API 的默认配置，`options` 提供的可选配置如下：

| 字段| 数据类型 | 必填 | 默认值  | 说明  |
| --  | -- | -- | -- | --
| env | string \| object | 是 | | 后续 API 调用的默认环境配置，传入字符串形式的环境 ID 或传入 [`cloud.DYNAMIC_CURRENT_ENV`](/minigame/dev/wxcloud/reference-sdk-api/constant/constant) 可以指定所有服务的默认环境，传入对象可以分别指定各个服务的默认环境，见下方详细定义 |

当 `env` 传入参数为对象时，可以指定各个服务的默认环境，可选字段如下：

| 字段| 数据类型 | 必填 | 默认值  | 说明  |
| --  | -- | -- | -- | --
| database | `string` | 否 | `default` | 数据库 API 默认环境配置 |
| storage | `string` | 否 | `default` | 存储 API 默认环境配置 |
| functions | `string` | 否 | `default` | 云函数 API 默认环境配置 |
| default | `string` | 否 | 空 | 缺省时 API 默认环境配置 |

**注意**：`env` 设置只会决定本次云函数 API 调用的云环境，并不会决定接下来其他被调云函数中的 API 调用的环境，在其他被调云函数中需要通过 `init` 方法重新设置环境。

**建议**：在设置 `env` 时指定 [`cloud.DYNAMIC_CURRENT_ENV`](/minigame/dev/wxcloud/reference-sdk-api/constant/constant) 常量 (需 SDK `v1.1.0` 或以上) ，这样云函数内发起数据库请求、存储请求或调用其他云函数的时候，默认请求的云环境就是云函数当前所在的环境：

```js
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

exports.main = async (event) => {
  const { ENV, OPENID, APPID } = cloud.getWXContext()

  // 如果云函数所在环境为 abc，则下面的调用就会请求到 abc 环境的数据库
  const dbResult = await cloud.database().collection('test').get()

  return {
    dbResult,
    ENV,
    OPENID,
    APPID,
  }
}
```

> 注意：上述代码中的 `env` 参数的值不能用 `cloud.getWXContext().ENV` 替代，因为在 `exports.main` 外部调用的 `getWXContext()` 无法获取到当前环境

## API 风格

云开发的 API 风格与框架组件和 API 风格一致，但同时支持**回调**风格和**Promise**风格。在传入 API 的 Object 参数中，如果传入了 `success`、`fail`、`complete` 字段，则我们认为是采用**回调**风格，API 方法调用不返回 `Promise`。如果传入 API 的 Object 参数中 `success`、`fail`、`complete` 这三个字段都不存在，则我们认为是采用**Promise**风格，API 方法调用返回一个 `Promise`，`Promise` resolve 的结果同传入 `success` 回调的参数，reject 的结果同传入 `fail` 的参数。

## 注意事项

* 如果 `init` 时不传 `env` 参数，后续 API 调用将默认请求到第一个创建的环境，但这种方式并不总是预期的，因此这种方式已废弃，请务必明确传入 `env` 参数
