相信這對於想要入門寫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項目了,再稍微將文件處理下,模塊的區分,就能夠完成一個基本框架的構建啦。