如何让koa2项目支持ES7的import和aysnc,await语法
发布于 11 天前 作者 Andyliwr 635 次浏览 来自 分享

前言

自己使用koa-generator生成一个koa项目后,却发现js的语法都是很老的nodejs,还在用var来定义变量,导入包也是用的require。作为一名nodejs忠实粉丝,怎么也得高大上一点嘛!下面就介绍怎么让koa2项目支持ES7的importaysncawait语法。

安装runkoa

这个是runkoa官方介绍,作者确实是个好人,替koa的开发者省去了配置babel的步骤。使用方法如下: 在控制台输入:

cnpm install -g runkoa

bin/目录下面新建一个名为run的文件,并复制一下代码:

#!/usr/bin/env node

var current_path = process.cwd();
require('runkoa')(current_path + '/bin/www')

修改package.jsonscripts命令,将www修改成为run

"scripts": {
    "start": "node bin/run",
    "dev": "./node_modules/.bin/nodemon bin/run",
    "prd": "pm2 start bin/run",
    "test": "echo \"Error: no test specified\" && exit 1"
},

如此,再输入npm run dev, 就可以将require变成import,并且支持asyncawait

遇到的坑

在使用mongoose的时候,我将操作数据库的代码都放在了schemastatics属性中。写代码的时候请注意asyncawait是要一起出现的,也就是使用了await的方法必须前面有async的关键字。这个我查了好久,家里的网差,很心累。后来使用koa新建了一个测试项目,将两个项目对比,才发现在定义statics的方法的时候没有使用async关键字,但是在调用的时候却使用了await,于是控制台一直报await is a reserved word

# 定义
userSchema.statics.checkname = async function(ctx, name) {
    let document = await this.findOne({ username: name })
    if (document) {
        return { ok: false, msg: '用户名已经存在' }
    } else {
        return { ok: true, msg: '用户名合法' }
    }
}

# 调用
ctx.body = await User.checkname(ctx, name)

详情可以查看我的博客:http://www.andylistudio.com/2017/10/30/koa2_await_suport/

10 回复

使用node7.6以上的版本,使用reuqire代替import

koa 本身就可以 async await 吧,至于 import,不可以直接等价替换 require 啊……

@rwing 现在的版本是可以了,我当时选择的koa xxx初始化的项目,选择koa2 xxx初始化是支持async await的

原生 async/await 在 Node 7 版本以后就可以用了,runkoa 是基于 babel-polyfill,所以不用关心 babel 相关的东西,自己使用 babel-polyfill 也有一样的效果。如果不使用 import 的话,完全可以在 Node 7.0+ 版本中使用原生的 ES7 语法。

想用import就上Typescript

import v8目前还没有实现 ,所以还不能原生使用,只能选择babel

v8 还没有实现原生的 import,可以借助 babel,给个参考的框架。https://github.com/shuperry/starterkit-api

今天才发现 middleware 才是koa的精华所在。。。。。。。

为啥要放在static中,。。。我不懂, 好像我直接async替代static 也能用。。。不知道该怎么写,,,

Group.model.js

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const GroupSchema = new Schema({
    name: { type: String, default: 'Moonlight' },
    avatorUrl: { type: String, default: '' }
});
const groupModel = mongoose.model('groups', GroupSchema);
class Group {
    async init(data){
        let isExist = await groupModel.findOne(data);
        console.log(isExist);
        return !isExist && new groupModel(data).save();
    }
}

module.exports = new Group();

index.js

const Koa = require('koa');
const app = new Koa();
app.use(async (ctx)=>{
	await Group.init({
		name:'peng',
		avatorUrl:''
	})
})

@pengliheng 将方法写成Schema的静态方法的好处就是所有的model都能调用,方便方法的重用

回到顶部