基于Nodejs的下一代Web框架
Express 团队开发,更小,更健壮,更优雅
//1.0
app.use(function *(){
yield newUser.save();
this.body = {
word: 'save succeed!'
};
});
//2.0
app.use(async function (ctx, next){
await newUser.save()
ctx.body = {
word: 'save succeed!'
}
});Nodejs: node 0.11.x + --harmony
浏览器:[链接]
Generator函数的语法糖
与Generator 好处
浏览器:[链接]
Nodejs: 7.0 + --harmony
代码级联
//2.0
var koa = require('koa');
var app = koa();
// x-response-time
app.use(async (ctx, next){
var start = new Date;
await next();
var ms = new Date - start;
this.set('X-Response-Time', ms + 'ms');
});
// logger
app.use(async (ctx, next){
var start = new Date;
await next();
var ms = new Date - start;
console.log('%s %s - %s', this.method, this.url, ms);
});
// response
app.use(asyc (ctx, next){
ctx.body = 'Hello World';
});
app.listen(3000);|-common/ 一些公用方法
|-config/ 配置文件
|-models/ 数据Model层
|-routes/ 路由文件
|-index.js 应用的主要入口
|-routes.js 路由声明文件
|-package.json 声明各种依赖
var router = require('koa-router')()
var koa = require('koa')
var mongoose = require('mongoose')
var statics = require('koa-static-folder')
var fs=require('fs')
var app = module.exports = new koa()
//config
var config = require('./config/config')
//connect to database
var mongoUrl = config.mongo.host + ':' + config.mongo.port + '/' + config.mongo.database
mongoose.connect(mongoUrl)
var db = mongoose.connection.on("error", function (err) {
console.log(err)
})
//load models
var modelsPath = "./models"
fs.readdirSync(modelsPath).forEach(function (file) {
if (~file.indexOf("js")) {
require(modelsPath + "/" + file)
}
})
// routes
require("./routes")(app, router)
if (!module.parent) app.listen(config.port, function () {
console.log('listening to http://localhost:' + config.port)
})
var index = require('./routes/index'),
add = require('./routes/add'),
show = require('./routes/show')
module.exports = function(app, router) {
app.use(router.routes())
app.use(router.allowedMethods())
router.get('/', index)
router.post('/add', add)
router.get('/show', show)
}var mongoose = require('mongoose')
var Schema = mongoose.Schema
var userSchema = new Schema({
name : String,
password : String,
mail : String,
createTime : { type: Date, default: Date.now }
})
mongoose.model('user', userSchema)
var mongoose = require('mongoose'),
user = mongoose.model('user')
module.exports = async function (ctx, next) {
var users = await user.find({
name: 'xiaoming'
}).exec(function(doc, error) {
if (error) {
console.log(error)
}
})
ctx.body = users
}
app.on('error', function(err, ctx){
log.error('server error', err, ctx);
});koa + socket.io
var koa = require('koa.io'),
common = require('./common/common'),
app = koa();
// middleware for koa
app.use(function*() {});
// middleware for socket.io's connect and disconnect
app.io.use(function*(next) {
// on connect
app.io.route('join', function*() {
var id = this.data[0];
console.log((id ? id : '默认画板') + '进人了!');
this.join(id);
app.io.route('draw Curve', function*() {
this.broadcast.to(this.rooms[1]).emit('draw Curve', this.data[0]);
});
app.io.route('draw Point', function*() {
this.broadcast.to(this.rooms[1]).emit('draw Point', this.data[0]);
});
app.io.route('clear Pad', function*() {
this.broadcast.to(this.rooms[1]).emit('clear Pad', this.data[0]);
});
});
yield* next;
// on disconnect
});
app.listen(9201);