# Resource

Resource is used to define resource instance. Resource instances managed by resourcer can be accessed through HTTP requests.

## Constructor

To create resource instance. Normally it is not used directly, but replaced by the call of the `define()` interface of resourcer.

**Signature**

* `constructor(options: ResourceOptions, resourcer: Resourcer)`

**Parameter**

| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `options.name` | `string` | - | Name of the resource, corresponding to the resource address in the route of the URL |
| `options.type` | `string` | `'single'` | Type of the resource, options are `'single'`, `'hasOne'`, `'hasMany'`, `'belongsTo'`, `'belongsToMany'` |
| `options.actions` | `Object` | - | List of actions that can be taken on the resource, see the example for details |
| `options.middlewares` | `MiddlewareType \| MiddlewareType[]` | - | List of middlewares for any operational access to the resource that is definingļ¼Œsee the example for details |
| `options.only` | `ActionName[]` | `[]` | Whitelist for global actions, only actions contained in the array (if `length > 0`) can be accessed |
| `options.except` | `ActionName[]` | `[]` | Blacklist for global actions, all actions except those contained in the array (if `length > 0`) can be accessed  |
| `resourcer` | `Resourcer` | - | The resourcer instance |

**Example**

```ts
app.resourcer.define({
  name: 'books',
  actions: {
    // Extended action
    publish(ctx, next) {
      ctx.body = 'ok';
    }
  },
  middleware: [
    // Extended middleware
    async (ctx, next) => {
      await next();
    }
  ]
});
```

## Instance Members

### `options`

Configuration items for the current resource.

### `resourcer`

The resourcer instance to which the resource belongs.

### `middlewares`

The registered middlewares.

### `actions`

The registered mapping table of actions.

### `except`

Actions that are excluded.

## Instance Methods

### `getName()`

Get the name of the current resource.

**Signature**

* `getName(): string`

**Example**

```ts
const resource = app.resourcer.define({
  name: 'books'
});

resource.getName(); // 'books'
```

### `getAction()`

Get action with the corresponding name.

**Signature**

* `getAction(name: string): Action`

**Parameter**

| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `name` | `string` | - | Name of the action |

**Example**

```ts
const resource = app.resourcer.define({
  name: 'books',
  actions: {
    publish(ctx, next) {
      ctx.body = 'ok';
    }
  }
});

resource.getAction('publish'); // [Function: publish]
```