koa
Koa 2
这是一个极其简单的的Web框架,核心框架就几个文件。它需要的环境必须大于等于Node V7(另一种方式我觉得就不要试了),因为它使用了原生的Async/Await方法,这些都可以有效的避免回调地狱的问题。1234application.js # 核心库context.js # 上下文处理,比如toJson(), Error处理,Request和Response处理路由request.js # Request 详细处理类response.js # Response 详细处理类
- 老规矩,Hello World镇楼:
|
|
- 当你需要写一些需要回调的方法时候,用Node V7就爽了:
|
|
- 处理错误以及异常
|
|
抛出异常123ctx.throw(403);ctx.throw('name required', 400);ctx.throw(400, 'name required');
获取Request信息
12345678910111213141516171819202122232425262728293031323334353637# 获取POST信息Post: ctx.request.body;# 获取问号传值的信, 比如?a=b, 那么就可以写成 ctx.request.query.aGet: cxt.request.query;ctx.headerctx.headersctx.methodctx.method=ctx.urlctx.url=ctx.originalUrlctx.originctx.hrefctx.pathctx.path=ctx.queryctx.query=ctx.querystringctx.querystring=ctx.hostctx.hostnamectx.freshctx.stalectx.socketctx.protocolctx.securectx.ipctx.ipsctx.subdomainsctx.is()ctx.accepts()ctx.acceptsEncodings()ctx.acceptsCharsets()ctx.acceptsLanguages()ctx.get()获取Response信息
123456789101112131415161718ctx.bodyctx.body=ctx.statusctx.status=ctx.messagectx.message=ctx.length=ctx.lengthctx.type=ctx.typectx.headerSentctx.redirect()ctx.attachment()ctx.set()ctx.append()ctx.remove()ctx.lastModified=ctx.etag=
嗯,就是这么简单。
Koa Router
毕竟,这个框架太简洁,如果我们要单独处理,http method,大概大家会疯掉的,于是,偷懒一下;引入一个扩展
Koa Better Router
|
|
Koa Body
同样,我觉得原生的对于post的处理很不好(懒),所以,我决定引入扩展(‘koa-bodyparser), 它可以更友好的处理body的解析。
如果,是传递的是Content-Type: application/json, 那么它会自动解析成JS对象。
|
|
Koa Render
呃,主要是用来渲染页面方便
|
|
Mongoose
MongoDB 的ORM扩展, 可以很方便的的查询数据库等等,借助于语言本身天生异步处理,所以可以实现最大化的性能优势。
首先,可以创建models的文件, 数据类型如下
- String
- Number
- Date
- Boolean
- Mixed (这个有点意思,混合类,由于mongo可以是数组,也可是Object)
- ObjectId , MongoID类型,当然也可以生成的字符串类型的对象ID,new Mongoose.ObjectId, 就会生成的ID(其实一般也没啥用)
- Array12345678910111213141516171819202122232425262728# 创建文件App.jsmodule.exports = new Schema({app_name: {type: Schema.Types.String,index: true, // 表示它是索引unique: true,//唯一,不能重复maxlength: 20 //表示最大长度是20,如果输入超过20,数据库会报错,注意,这个错误是程序级别的,不是数据库级别的。},app_name_hash: {type: Schema.Types.String},app_version: Schema.Types.String, //版本app_content: Schema.Types.Mixed, // 内容project_info: {project_name: Schema.Types.String, //基础信息中的项目名称project_id: Schema.Types.Number, // 基础信息中的项目ID},status: {type: Schema.Types.Number,default: 1 //1, 正常; 2, 关闭,},preview_port: Schema.Types.Number //预览端口},{collection: 'app_templates'});
查询一个
- 查询一个App123456789# 引入modellet model = require('App');# 查询一条数据let app_info = App.findOne({app_name: params.app_name,app_version: params.app_version});# 查询多条数据, select表示,保留哪些fields字段let app_components = App.find().select({comp_id: 1, comp_name: 1, comp_desc: 1, _id:0}).exec();
- 查询一个App
插入一条数据
12345678910111213141516let model = require('App');let app = new App({app_name: params.app_name,app_name_hash: app_name_hash,app_version: app_version,app_structure: {},app_content: {},project_info:{project_name: params.project_name,project_id: params.project_id},preview_port: params.preview_port});# 注意异步的事情,有可能它还没执行完,就去执行下一步了,哈哈哈哈哈,小心哟app.save();更新一条数据
1234567# 先查一下, 再更新let app_info = App.findOne({app_name: params.app_name,app_version: params.app_version});app_info.app_name = '哈哈哈哈';app_info.save();
Cherrio
用来快速解析HTML
Fs-extra
用来扩展FS文件处理。