该项目主要示范如何使用koa搭建后端项目,方便初学者入门,并使用
mongoDB
作为数据存储,项目的github地址(typescript版本)
├── config 应用配置目录
│ ├── default.json 默认配置
│ └── production.json 生产环境配置
├── controller 路由处理逻辑目录
│ ├── account
│ │ ├── helper.js 工具函数
│ │ ├── index.js
│ │ └── validate.js 接口参数验证文件
│ └── index
│ ├── helper.js
│ └── index.js
├── log 日志目录
│ ├── app.log
│ └── error.log
├── models 数据库模型目录
│ ├── db.js 链接MongoDB数据库
│ └── index.js 数据库模型
├── router 应用路由目录
│ ├── account.js
│ ├── githubApi.js
│ ├── index.js
│ └── upload.js
├── static 静态资源目录
├── utils.js 工具函数文件
├── views html模板目录
│ └── test.html
├── index.js 应用主文件
├── constants.js js常量文件
├── Dockerfile docker file
├── README.md
├── nodemon.json nodemon配置文件
├── package.json
├── package-lock.json
└── yarn.lock
编写nodejs应用,首先想到的肯定是路由处理,koa-router
是koa
的路由处理中间件,一个简单的根路由get
请求处理:
router/index.js
const router = require('koa-router')();
router.get('/', () => {
console.log(ctx.request.header);
ctx.body = 'here is home.';
})
module.exports = router;
然后还需要通过app.use
语法调用这个中间件:
index.js
const Koa = require('koa');
const indexRouter = require('./router/index');
const app = new Koa();
app.use(indexRouter.routes());
app.listen(3000, () => {
console.log('server is running at localhost:3000');
console.log(process.env.NODE_ENV);
});
最后直接通过node index.js
启动,就可以访问localhost:3000/
就能查看处理结果了~~
当然在项目中,某个路由的处理可能会很复杂,可以将路由处理的具体函数抽离到单独的js文件,比如说新建一个controller
目录存放这类逻辑处理函数:
controller/index.js
module.exports = {
index: (ctx, next) => {
ctx.body = 'here is home.'
}
}
那么router/index.js
就变成了:
const router = require('koa-router')()
const homeController = require('../controller/index');
router.get('/', homeController.index);
module.exports = router;
如果你觉得homeController.index
函数还是过于复杂,还可以抽离出一个helper.js
放置一些工具函数等。反正尽量最大的做到函数单一职责,这样方便代码复用以及后期维护。
使用koa-bodyparser
解析post
请求发送的body
内容:
const Koa = require('koa');
const app = new Koa();
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());
app.listen(3000, () => {
console.log('server is running at localhost:3000');
console.log(process.env.NODE_ENV);
});
然后就可以从ctx
对象中拿到body的具体内容了:ctx.request.body
koa-nunjucks-2
是koa
的一个模板引擎,使用方法如下:
const Koa = require('koa');
const path = require('path');
const app = new Koa();
const nunjucks = require('koa-nunjucks-2');
app.use(nunjucks({
ext: 'html',
path: path.join(__dirname, 'views'),
nunjucksConfig: {
trimBlocks: true
}
})); // path为你模板文件放置位置
app.listen(3000, () => {
console.log('server is running at localhost:3000');
console.log(process.env.NODE_ENV);
});
然后就可以在某个路由处理函数中渲染写好的模板,例如:
const router = require('koa-router')();
router.get('/test', async (ctx, next) => {
await ctx.render('test', {
pageName: '这里是模板引擎测试页面'
});
await next();
})
访问localhost:3000/test
就可以访问到views
文件夹下的test.html
文件。
koa-static
是koa的一个静态资源处理中间件,一般用它指定项目中的某个目录为静态资源目录,例如:
const Koa = require('koa');
const path = require('path');
const app = new Koa();
const serve = require('koa-static');
app.use(serve(path.resolve(__dirname, "./static"))); // serve参数为静态文件目录
app.listen(3000, () => {
console.log('server is running at localhost:3000');
console.log(process.env.NODE_ENV);
});
这意味着你可以直接通过路由访问static
文件夹下的资源,而不用专门去写路由处理函数,例如在static
目录下有一个css文件为test.css
,你可以直接通过localhost:3000/test.css
访问到文件内容。
config
模块用来作为node项目配置文件的管理,一般配置文件分为开发、生产两种情况,在配置文件中你可以放置一些配置信息:
使用config
模块后,他会自动读取config
文件夹下的default.xxx
文件的配置信息(文件类型可以为json
,也可以是yml
),还可以根据你项目所在环境读取其他文件内容作为default.xxx
文件的覆盖,例如部署环境下启动项目:
corss-env NODE_ENV=production node index
它就会读取production.xxx
文件覆盖default.xx
文件,获取配置信息时,config模块提供了get
方法直接获取,例如:
const Koa = require('koa');
const config = require('config');
const app = new Koa();
const port = config.get('host.port');
app.listen(port, () => {
console.log(`server is running at localhost:${port}`);
console.log(process.env.NODE_ENV);
});
这样就可以在配置文件指定的端口启动项目了~~更详细内容,可以查看它的npm库的介绍
最后是使用mongoose
链接mongoDB
数据库,基本就两个步骤:首先链接数据库,可以对链接成功或者失败做一个监听,然后创建数据库model
用于数据库的操作,这其中可能还包括schema
建立数据库表的结构。
models/db.js 导出一个函数用于链接数据库
const mongoose = require('mongoose')
const config = require('config')
const chalk = require('chalk')
const hostName = config.get('mongoDB.hostname')
const port = config.get('mongoDB.port')
const dbname = config.get('mongoDB.dbname')
const dbUrl = `mongodb://${hostName}:${port}/${dbname}`
function initDb() {
mongoose.connect(dbUrl, error => {
if(error) {
console.log(chalk.red('数据库连接失败'), error)
} else {
console.log(chalk.green('数据库连接成功。'))
}
})
return mongoose.connection
}
module.exports = initDb
创建一个用户账号的数据库模型:
models/index.js
const mongoose = require('mongoose')
const accountSchema = mongoose.Schema({
accountName: {
type: String,
required: true
},
accountPwd: {
type: String,
required: true
}
})
const accountModel = mongoose.models.account || mongoose.model('account', accountSchema, 'account')
module.exports = {
accountModel
}
最后就可以在其他文件使用这个模型做数据库的CRUD
。mongoose提供了很多的api用于数据库操作,
更多的操作,请查看mongoose
的官方文档,这里不再累述。
node项目的启动很简单,直接运行主文件:node index.js
,当然实际开发还会需要加上环境变量的设置,这里我们可以使用cross-env这个库,它的优点是跨平台设置环境变量:cross-env NODE_ENV=dev node index
。我们可以在本地简单运行查看效果,生产环境,作为公司级别项目一般使用docker部署(示例项目有提供docker启动方式,很简单~~
),更进一步可以部署在k8s集群内,这里不过多描述。
平时开发中很重要的一点是进行调试,为了方便我们使用断点调试的功能,加上--inspect
启动项目:node --inspect index
,你可以直接打开chrome浏览器的控制台,在source源文件内进行断点调试,就像平时web开发一样,如果你觉得浏览器调试过于麻烦,也可以在编辑器中配置断点开发,例如vscode。
还有一个问题是,假如我们修改了项目中的文件,每次都需要手动的去重新启动项目,很麻烦,这里可以通过nodemon
模块来达到修改项目文件后,自动重启项目。首先需要安装nodemon作为开发依赖:
npm install --save-dev nodemon
其次新建nodemon.json文件作为它的配置:
{
"ignore": ["**/*.test.ts", "**/*.spec.ts", ".git", "node_modules"], // 忽略文件
"watch": ["."], // 监听目录
"exec": "npm start", // 文件变动后,重新运行npm start
"ext": "js" // 监听js文件
}
启动时直接通过nodemon
命令。
如果你觉得这个项目对你有所帮助,希望能给个star
,万分感谢~~ 如果你在项目中发现了什么错误,请留言告诉我,谢谢~~如果有好的idea,我会继续往这个项目中添加新的内容。