By accessing the website and accepting the Cookie Policy, you agree to use the cookies provided by the Site in accordance with to analyze traffic, remember your preferences, and optimize your experience.
nodejs+koa2+mongodb 从0到1搭建自己的项目
2019-10-15 18:04:24    817    0    0
emengweb

 

相信这对于想要入门写nodejs的朋友来说,一定会有所收获,那么,下面开始我们的正题(这里不使用koa-generator脚手架,我们直接自己搭建项目,适用于前后端分离)

一:创建项目

可以在全局中安装koa依赖包 (保持项目版本的统一性)
npm install -g koa 
复制代码
或者在我们本地项目中安装
npm install koa --save
复制代码

最基本的开发环境我们已经搭建完了,可以开始koa之旅了:

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

二. 添加路由

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, 就可以访问到了

你也可以为你的路由加个前缀

const Router = require('koa-router')

const router = new Router({
	prefix: '/api'
})
复制代码

这样只需要访问 http://localhost:9000/api, 而我们写接口的时候,这个前缀就可以说是少不的了。

三.热重启的处理

每一次我们修改都要关闭程序,然后再npm start, 这是想起webpack的热更是多么的舒服,想着要用webpack搭建吗,这时候就要用到nodemon(Nodemon是一个实用程序,用于监视源中的任何更改并自动重新启动服务器。完美的发展), 它还支持自定义配置nodemon.json这里不做配置,直接使用

npm install nodemon --save
复制代码

修改package.json

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app.js"
  },
复制代码

运行npm start,这样就达到了热重启的效果了,可以愉快的开发了

 

 

四.支持import模块的引入

由于目前原生的node是不支持import引入模块的,假如你使用import引入模块的话,会报如下的错:

 

 

这时候我们安装以下依赖

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

这里就不做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这个集合的,当我们运行该程序的时候,我们的数据库就会自动新增该集合了和数据了:

 

 

运行之后:

访问我们的localhost:9000

 

 

前端的小伙伴们,看到这个会不会很鸡冻,打开就是后端每天给我们提供的接口数据了,泪崩ing。

 

六.解决跨域

最后当我们写好的接口要提供给别人的时候,跨域的问题是必须解决的,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项目了,再稍微将文件处理下,模块的区分,就可以完成一个基本框架的构建啦。

上一篇: Baklib一个免费搭建博客/文档/手册平台

下一篇: Wear OS 官方设计指导

817 人读过
文档导航