相信这对于想要入门写nodejs的朋友来讲,必定会有所收获,那么,下面开始咱们的正题(这里不使用koa-generator脚手架,咱们直接本身搭建项目,适用于先后端分离)前端
npm install -g koa
复制代码
npm install koa --save
复制代码
最基本的开发环境咱们已经搭建完了,能够开始koa之旅了:node
const Koa = require('koa');
const app = new Koa();
// 对于任何请求,app将调用该异步函数处理请求:
app.use(async (ctx, next) => {
await next();
// todo
});
app.use(async (ctx, next) => {
await next();
// todo
});
// 在端口8081监听:
app.listen(8081);
复制代码
最原始的写法就是使用app.use(async (ctx, next) => {}),只有当next()以后才能执行下一个app.use(),因此这里引入了koa-routerwebpack
npm install koa-router koa-bodyparser --save
复制代码
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
app.use(bodyParser()); // 解析request的body
const router = require('koa-router')()
router.get('/', async (ctx, next) => {
// todo
})
app.use(router.routes());
app.listen(9000);
console.log('app started at port 9000...')
复制代码
这样直接访问 http://localhost:9000, 就能够访问到了web
你也能够为你的路由加个前缀mongodb
const Router = require('koa-router')
const router = new Router({
prefix: '/api'
})
复制代码
这样只须要访问 http://localhost:9000/api, 而咱们写接口的时候,这个前缀就能够说是少不的了。数据库
每一次咱们修改都要关闭程序,而后再npm start, 这是想起webpack的热更是多么的舒服,想着要用webpack搭建吗,这时候就要用到nodemon(Nodemon是一个实用程序,用于监视源中的任何更改并自动从新启动服务器。完美的发展), 它还支持自定义配置nodemon.json这里不作配置,直接使用npm
npm install nodemon --save
复制代码
修改package.jsonjson
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app.js"
},
复制代码
运行npm start,这样就达到了热重启的效果了,能够愉快的开发了后端
因为目前原生的node是不支持import引入模块的,假如你使用import引入模块的话,会报以下的错:api
这时候咱们安装如下依赖
npm install babel-plugin-transform-es2015-modules-commonjs babel-register --save
复制代码
在根目录下建立start.js
require('babel-register')
(
{
plugins: ['babel-plugin-transform-es2015-modules-commonjs'],
}
)
module.exports = require('./app.js')
复制代码
在修改下package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon star.js"
},
复制代码
直接运行npm start, 这时候能够看到咱们的项目已经支持import语法了
这里就不作mongodb的安装教程了,小伙伴们能够自行先去安装好mongodb,安装好以后,看到以下图片说明安装和启动成功了
npm install mongoose --save
复制代码
接下来我用简单暴力的方法来链接咱们的数据库mongodb, 这里为了方面让你们明白,就不作层次的处理以及文件的处理(实际项目这样作估计是加不了薪的噢)
在app.js中添加
const db = mongoose.connect("mongodb://localhost/testDB")
// 帐户的数据库模型
var UserSchema = new mongoose.Schema({
username:String,
password:String,
email:String
});
var User = mongoose.model('User',UserSchema);
// 新增数据
var user = {
username: 'ydj',
password: '123123',
email: ''
}
var newUser = new User(user);
newUser.save();
router.get('/', async (ctx, next) => {
let val = null
const data = await User.findOne({username: 'ydj'})
console.log('data', data)
const result = {
code:200,
response: data,
ts: 12345
}
ctx.response.body = result
return result
})
复制代码
这里的操做是: 新建一个用户的数据模型,接着讲user的数据加入到咱们的testDB数据库中,接着当咱们访问localhost:9000的时候,就会请求咱们的数据库,查询到数据以后返回。能够从上面图上看到,咱们刚开始是没有users这个集合的,当咱们运行该程序的时候,咱们的数据库就会自动新增该集合了和数据了:
运行以后:
最后当咱们写好的接口要提供给别人的时候,跨域的问题是必须解决的,koa这边也很好处理,提供了koa2-cors处理
npm install koa2-cors --save
复制代码
const cors = require('koa2-cors')
app.use(cors({
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization', 'Date'],
maxAge: 100,
credentials: true,
allowMethods: ['GET', 'POST', 'OPTIONS'],
allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Custom-Header', 'anonymous'],
}));
复制代码
关于koa2-cors其余相关配置,你们能够自行网上搜索
项目目录结构
├── node_modules 依赖包
├── routes 路由
| ├── index.js
| ├── user.js
├── app.js 主入口文件
├── start.js 处理import配置文件
└── package.json
复制代码
app.js
const Koa = require('koa')
const mongoose = require('mongoose')
const cors = require('koa2-cors')
const router = require('koa-router')()
// import router from './routes'
const app = new Koa()
// 处理跨域的配置
app.use(cors({
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization', 'Date'],
maxAge: 100,
credentials: true,
allowMethods: ['GET', 'POST', 'OPTIONS'],
allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Custom-Header', 'anonymous'],
}));
const db = mongoose.connect("mongodb://localhost/testDB")
var UserSchema = new mongoose.Schema({
username:String,
password:String,
email:String
});
var User = mongoose.model('User',UserSchema);
router.get('/', async (ctx, next) => {
let val = null
const data = await User.findOne({username: 'yidong'})
console.log('data', data)
const result = {
code:200,
response: data,
ts: 12345
}
ctx.response.body = result
return result
})
app.use(router.routes());
app.listen(9000);
console.log('app started at port 9000...')
复制代码
package.json
{
"name": "yid",
"version": "1.0.0",
"description": "",
"main": "app.js",
"dependencies": {
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"babel-register": "^6.26.0",
"koa": "^2.5.3",
"koa-bodyparser": "^4.2.1",
"koa-router": "^7.4.0",
"koa2-cors": "^2.0.6",
"mongoose": "^5.2.17",
"nodemon": "^1.18.4"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app.js"
},
"author": "",
"license": "ISC"
}
复制代码
start.js
require('babel-register')
(
{
plugins: ['babel-plugin-transform-es2015-modules-commonjs'],
}
)
module.exports = require('./app.js')
复制代码
routes/index.js
const router = require('koa-router')()
router.get('/', async (ctx, next) => {
ctx.body = "<div>Hello</div>"
})
router.get('/string', async (ctx, next) => {
ctx.body = 'koa2 string'
})
router.get('/json', async (ctx, next) => {
ctx.body = {
title: 'koa2 json'
}
})
// module.exports = router
export default router
复制代码
这时候咱们就能够愉快的开始咱们的nodejs+koa项目了,再稍微将文件处理下,模块的区分,就能够完成一个基本框架的构建啦。