Cell - MVC 组件
Cell 后端的控制器:带 @Controller 的类,其方法回应 HTTP 请求。它在 @celljs/web 上运行(node:http,没有 express)。指南:HTTP APIs。
npm install @celljs/mvc @celljs/express-adapter@celljs/express-adapter 是启动服务器的后端入口;cell init 模板已经依赖这两个包。
import { Body, Controller, Get, Param, Post } from '@celljs/mvc/lib/node';
@Controller('users')
export class UserController {
@Get(':id')
get(@Param('id') id: number) {
return { id }; // JSON
}
@Post()
create(@Body() user: { name: string }) {
return user;
}
}从 DI 模块中导入控制器的文件(src/node/module.ts),否则它不会被加载。
路由
| 装饰器 | |
|---|---|
@Controller(path?) | 一个组件(单例,为 AOP 代理),其方法是 path 下的路由。还接受 ComponentOption:@Controller({ path: 'users', rebind: true }) |
@Get、@Post、@Put、@Patch、@Delete、@Head、@Options | 一种 HTTP 方法;参数是控制器下的路径(':id'),对于控制器路径为空 |
@All(path?) | 每种方法 |
路径语法::name 是一个段,* 匹配任何东西,(...) 是可选的。路由挂载在 server.path(默认 /)下;mvc.path(默认 /*)是 MVC 处理器接受的请求模式。与任何路由不匹配的请求得到 404,消息中包含方法和路径。
参数
| 装饰器 | 值 |
|---|---|
@Param(name?) | 一个路径参数,或所有参数 |
@Query(name?) | 一个查询参数,或整个解析的查询 |
@Body(name?) | 解析体的一个字段,或整个体 |
@Header(name?) | 一个请求头,或所有头 |
@Cookie(name?) | 一个请求 cookie |
@Session(name?) | 一个会话值 |
@Req() / @Res() | @celljs/web 的请求 / 响应对象 |
类型为 String、Number、Boolean 或 Date 的参数会被转换。使用类类型的参数在安装 @celljs/validation 时会被验证。
响应
| 装饰器 | 响应 |
|---|---|
无或 @Json() | 返回值作为 JSON(mvc.defaultViewName: json) |
@Text() | 返回值作为 text/plain |
@Html(template?) | 用返回值渲染的 Mustache 模板(见下文) |
@File(file?) | 方法返回的 Buffer 或流,或 mvc.baseFileDir 中的文件 file(默认 assets,相对于服务器代码的目录) |
@View(name, metadata?) | 按名称的视图;通过绑定 View 添加视图 |
@Header(name, value) | 设置响应头 |
@Cookie(name, value) | 设置响应 cookie |
@Session(name, value) | 在会话中存储一个值 |
方法可以是 async。返回 undefined 回应 200 和空体。在响应上设置另一个状态(@Res() res,res.statusCode = 201)并照常返回体。
mvc.jsonView.template 用模板包装每个 JSON 响应和错误,用于回应 { "success": ..., "data": ... } 的 API:{{model}}(JSON,无时为 null)、{{error}}、{{success}} 和 {{code}} 被替换,每次出现;{{error}} 和 {{code}} 为 JSON 字符串转义,因此在引号内写入。
错误
抛出 HttpError(status, message) 或从 @celljs/web/lib/node 抛出一个子类如 NotFoundError 以该状态回应;其他错误回应 500。堆栈跟踪不被发送。@celljs/web 的错误处理器用 ErrorMessageResolver 允许的消息回应:在生产中服务器错误仅给出其状态文本(web.errors.exposeMessages 更改它)。使用 mvc.jsonView.template,JsonViewErrorHandler(优先级 2000)用模板回应每个错误并保留响应的状态。
@Catch(ErrorType | ErrorType[]) 在控制器的方法上处理其路由抛出的那些类型的错误;该方法获得错误,其返回值是响应:
@Catch(QuotaError)
@Text()
onQuota(err: QuotaError) {
return `handled: ${err.message}`;
}应用程序范围的错误处理是 @celljs/web 的 ErrorHandler。
HTML 视图
@Html('page.mustache') 从 mvc.mustache.baseViewDir(默认 assets/views)用方法返回的值渲染模板。mvc.mustache.cache: true 在内存中保留编译的模板。
模板使用 Mustache 语法,没有第三方引擎:
{{name}}写一个值,HTML 转义,{{{name}}}或{{& name}}原样;user.name读一个路径,.是当前项;{{#list}}...{{/list}}为每个项重复,进入对象,或在值是真值时显示;{{^list}}...{{/list}}在它是假值或为空时显示;{{! comment }}写不了。
不支持 Partial({{> name}})和其他分隔符({{=<% %>=}}):这样的模板在编译时失败。