前言
自己使用koa-generator
生成一个koa
项目后,却发现js
的语法都是很老的nodejs
,还在用var来定义变量,导入包也是用的require
。作为一名nodejs
忠实粉丝,怎么也得高大上一点嘛!下面就介绍怎么让koa2
项目支持ES7的import
和aysnc
,await
语法。
安装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.json
的scripts
命令,将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
,并且支持async
和await
。
遇到的坑
在使用mongoose
的时候,我将操作数据库的代码都放在了schema
的statics
属性中。写代码的时候请注意async
和await
是要一起出现的,也就是使用了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/
使用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
@pengliheng 将方法写成Schema的静态方法的好处就是所有的model都能调用,方便方法的重用
babel babel babel
修改package.json的scripts命令,将www修改成为run
这样修改,当文件被修改了,不能实时更新,换成nodemon命令即可
nodemon bin/run