介绍
在现代 Web 开发中,Node.js 后端服务日益重要,因为它是前端开发的核心组件之一。它能够与各种官方语言进行交互,如 JavaScript、CSS 和 HTML。在这一篇文章中,我们将介绍如何使用 Koa+MongoDB+Redis+PM2 等内容构建一个功能集成服务端环境(有详细且有深度和学习以及指导意义),包含了了许多实际的示例代码,读完后,你将会掌握以下技能:
- 在 Node.js 中使用 Koa+MongoDB+Redis 的特性。
- 如何使用 PM2 工具进行应用的部署与维护并学会一系列的优化技能。
环境配置
1. MongoDB
作为我们需要使用的 NoSQL 数据库,首先要在本机环境中安装 MongoDB。
下载地址:https://www.mongodb.com/download-center/community
在安装完成以后,需要创建一个新的数据存储目录、日志目录及相应的配置文件,编辑配置文件,保存过后开启 MongoDB。
> dbpath=/data/db > logpath=/data/logs/mongodb.log > fork=true > bind_ip=127.0.0.1
检测是否启动成功:
mongo > use testdb > db.test.save({name: 'test'}) // 写入操作 > db.test.findOne() // 查看操作
可得到:
{ "_id" : ObjectId("54759eb3c090d83494e2d804"), "name" : "test" }
2. Redis
Redis 是常用的 NoSQL 数据库,我们可以使用它来作为缓存。同样地,我们需要在本机环境中安装 Redis。
下载地址:https://redis.io/download
在安装完成以后,使用命令 redis-server 开启 Redis。
> redis-server
检测是否启动成功:
> redis-cli 127.0.0.1:6379> set key value OK 127.0.0.1:6379> get key "value"
3. 安装 PM2
针对实际需要,我们需要使用 PM2 进行应用的部署与维护。
npm install pm2 -g
Koa 框架
Koa 是一个新的 Node.js Web 框架,它使用了 ES2016/ES7 进行了改进,采用了中间件的方式。它是 Express 框架的升级版,它带来了更加优秀的异步支持以及许多新的语法糖。
Koa 的最大特点之一就是如何处理异步请求,它具有良好的异步能力,这也就是它成为 Node.js 后端开发的首选框架的原因。
Koa 项目基础
我们可以首先创建一个基础项目,使用 Koa 框架来搭建我们的 Web 应用程序。这样,一些重复的代码可以省略,我们遵守了 DRY(Don't Repeat Yourself) 代码设计原则。
创建项目
首先,我们创建一个目录, cd 进入该目录,然后使用 npm init 初始化 Node.js 项目。
mkdir koa-demo && cd koa-demo && npm init
按照提示一步步完成初始化后,我们将会得到一个 package.json 文件。
安装依赖
接着,安装 koa、koa-router、koa-bodyparser。
npm i koa koa-router koa-bodyparser --save
koa-bodyparser
是用来解析 POST 请求体的中间件。
编辑代码
创建一个名为 app.js
的文件,编辑如下内容:
// javascriptcn.com 代码示例 const Koa = require('koa') const Router = require('koa-router') const bodyParser = require('koa-bodyparser') const app = new Koa() const router = new Router() router.get('/', async ctx => { ctx.body = 'Hello, World!' }) app.use(bodyParser()) app.use(router.routes()) app.use(router.allowedMethods()) app.listen(3000) console.log(`Server running at http://localhost:3000/`)
这样,在本地 3000 端口号上我们已经运行一个简单的 Web 服务程序了,当浏览器访问 http://localhost:3000/ 的时候,会显示 'Hello, world!'。
这是 Koa 的一个非常基本的例子,下一步我们要做的就是连接数据库,支持用户注册和登录逻辑。
MongoDB
连接 MongoDB 是我们首要的任务,我们将通过一些 Node.js 依赖模块来实现这个过程。
安装依赖:
npm i mongodb --save
接着,创建一个名为 mongo-db.js
的文件,编辑如下内容:
// javascriptcn.com 代码示例 const MongoClient = require('mongodb').MongoClient const ObjectID = require('mongodb').ObjectID const CONNECTION_URL = 'mongodb://localhost:27017' const DATABASE_NAME = 'koa-demo' let database module.exports = { connect: async () => { const client = await MongoClient.connect(CONNECTION_URL, { useNewUrlParser: true }) database = client.db(DATABASE_NAME) }, get: () => database, generateObjectID: () => new ObjectID(), }
我们可以看到,生成了一个 connect
函数和 get
函数,其中 connect
函数是异步函数,用于创建数据库连接并返回该数据库实例,get
函数是用于访问该数据库实例的函数,我们在之后的操作中会频繁地调用该函数,最后,mongodb 的 ObjectID
可以用于生成一个唯一且不可重复的 ID 。
Redis
安装 Redis,配置 Redis IP、端口,连接 Redis 服务器。
// javascriptcn.com 代码示例 const redis = require('redis') const REDIS_URL = 'redis://127.0.0.1:6379/0' let redisClient module.exports = { connect: () => { // 创建Redis客户端 redisClient = redis.createClient({ url: REDIS_URL }) redisClient.on('error', (error) => { console.error(error) }) }, get: () => redisClient }
我们已经完成了 Redis 的链接工作,当您开发代码时,您可以简单地调用 redisClient.set(key, value)
和 redisClient.get(key, cb)
来写入和获取缓存。
优化
现在,我们已经可以连接到数据库和 Redis 缓存,我们的 Web 服务也已经运行成功,但是,在真实应用中,会遇到许多问题,如:
- 路由的路由分离
- 错误处理
- 日志记录
- 安全问题
因此,在我们的 app.js
应用程序中要增加一些中间件,以加强应用程序的性能和安全性。
路由分离
npm i --save koa-compose koa-convert
koa-compose :从 koa 2.x 规范解决重用中间件、支持 koa 中使用 Express 模版
koa-convert:将 koa 1.x 中使用的依赖库,转换成 koa 2.x 适用的依赖库。
在目录里新建 pages 对应不同的页面,引入该页面的路由到 routes 内统一管理。
// javascriptcn.com 代码示例 const compose = require('koa-compose') const convert = require('koa-convert') const fs = require('fs') module.exports = (app) => { let routers = [] fs.readdirSync(__dirname + '/pages').forEach(function (file) { if (~file.indexOf('.js')) { routers.push(require(__dirname + '/pages/' + file).routes()) } }) // Use all routes app.use(convert(compose(routers))) }
错误处理
错误处理是 Web 应用的重要一环,尤其是在 Koa.js 中。就像在 Koa 中的很多操作一样,错误处理也是通过中间件来完成的。
// javascriptcn.com 代码示例 app.use(async (ctx, next) => { try { await next() } catch (err) { ctx.status = err.status || 500 ctx.body = { status: 'error', message: err.message, } ctx.app.emit('error', err, ctx) } })
这样,当 next 函数发生错误时,它会把控制权交给下一个中间件,因此必须有一个中间件来处理所有未知错误。因为我们使用了异步方法,所以需要使用 try-catch 来捕获错误。
日志记录
日志记录是对 Web 应用程序性能和安全的监测过程。将日志存储在数据库中,我们可以轻松地对其进行搜索和分析。
// javascriptcn.com 代码示例 const logger = require('koa-logger') const koaLogger = require('koa-logger-winston') const { createLogger, format, transports } = require('winston') const loggerOptions = { level: 'info', format: format.combine(format.timestamp(), format.json()), transports: [ new transports.Console(), new transports.File({ filename: 'logs/error.log', level: 'error' }), new transports.File({ filename: 'logs/info.log', level: 'info' }), ], } const appLogger = createLogger(loggerOptions) app.use(logger()) if (app.env === 'development') { app.use(koaLogger(appLogger)) } appLogger.info('Server running at http://localhost:3000/')
以上代码展示了我们如何使用 koa-logger
和 winston
将日志记录到本地文件中,并通过 koa-logger
中间件记录输出到终端,这样可以适用于开发调试环境和生产环境。
客户端错误日志统计推荐 sentry,方便快速处理。
安全问题
- CSRF:全称 Cross Site Request Forgery,中文名为跨站请求伪造。需要用到 koa-session 和 koa-csrf 中间件,它们都是为了防止 CSRF 攻击的。但 koa-session 中间件必须配合决策机制(cookie),我们可以使用加密的 cookie 记录来防止信息被窃取。
- 跨域:koa-cors 中间件实现跨域。
- XSS:全称 Cross Site Scripting,中文名为跨站脚本攻击。
npm i --save koa-session koa-csrf koa-cors
// javascriptcn.com 代码示例 const session = require('koa-session') const bodyParser = require('koa-bodyparser') const CSRF = require('koa-csrf') const cors = require('koa-cors') app.keys = ['secret'] app.use(bodyParser()) app.use(session(app)) app.use(new CSRF({ invalidTokenMessage: 'Invalid CSRF token', invalidSessionSecretMessage: 'Invalid session secret', invalidSessionMessage: 'Invalid session', excludedMethods: ['GET', 'HEAD', 'OPTIONS'], })) app.use(cors({ credentials: true, maxAge: 2592000, })) app.listen(3000) console.log(`Server running at http://localhost:3000/`)
总结
在这篇文章中,我们介绍了如何使用 Koa+MongoDB+Redis+PM2 等内容构建 Node.js 服务端程序,在完成应用的部署与维护之后,也对其进行了有针对性的优化和监控,这些内容有详细且有深度和学习以及指导意义,并包含了许多实际的示例代码,通过以上学习,您已经学会了如何使用 Koa 框架, 利用中间件优化应用程序,并保护应用程序的安全。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6530b81f7d4982a6eb247616