node.js框架koa配置mongoDB搭建后端项目

该项目主要示范如何使用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

使用模块介绍

koa-router

编写nodejs应用,首先想到的肯定是路由处理,koa-routerkoa的路由处理中间件,一个简单的根路由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

使用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-nunjucks-2koa的一个模板引擎,使用方法如下:

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-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

config模块用来作为node项目配置文件的管理,一般配置文件分为开发、生产两种情况,在配置文件中你可以放置一些配置信息:

  • 项目名称
  • 版本号
  • 数据库名称、域名、端口、账号、密码等
  • 项目部署主机ip
  • 等等

使用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

最后是使用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命令。

JJYY

如果你觉得这个项目对你有所帮助,希望能给个star,万分感谢~~ 如果你在项目中发现了什么错误,请留言告诉我,谢谢~~如果有好的idea,我会继续往这个项目中添加新的内容。

你可能感兴趣的:(【NodeJs】)