如何用koa构造优雅的端口服务
前言
NodeWeb旨在为开发者提供高效的后端解决方案。基于Node.js技术栈,NodeWeb利用其非阻塞I/O和事件驱动的特性,能够轻松处理大规模并发请求,适用于构建实时应用和RESTful API。其模块化设计和丰富的npm生态系统,使开发者能够快速集成各种功能和工具,加速开发周期。NodeWeb支持跨平台部署,适用于各种操作系统,包括Windows、Linux和macOS。借助Express.js等框架,开发者可以快速搭建轻量级且高性能的Web服务器。无论是初学者还是经验丰富的开发者,NodeWeb都是一个强大且灵活的选择,推动现代Web应用的开发与部署。
1. 导入模块
const http = require('http');
const Url = require('url')
const fs = require('fs')
const path = require('path')
-
http模块:
- 允许创建HTTP服务器和客户端。
- 可以处理HTTP请求和响应,包括头部信息、状态码等。
- 提供了构建基本的Web服务器和客户端的功能。
-
url模块:
- 提供了处理URL的工具,包括解析、格式化和拼接URL。
- 允许解析URL字符串为URL对象,并提取其各个部分,如协议、主机、路径等。
-
fs模块:
- 提供了文件系统相关的操作,如读取文件、写入文件、修改文件、删除文件等。
- 支持对文件和目录进行操作,如创建目录、重命名文件、获取文件状态等。
-
path模块:
- 提供了处理文件路径的工具,能够有效地处理不同操作系统下的路径格式。
- 包括路径解析、路径拼接、获取文件名和扩展名等操作。
2.构建服务
const server = http.createServer((req, res) => {
const reqUrl = Url.parse(req.url)
console.log(req.url + '5555');
console.log(reqUrl);
}
server.listen(3000, () => {
console.log('Server is running on port 3000');
})
我们获取到http对象之后采用里面的方法去构建一个web服务,然后打印里面回调函数里的参数,req代表请求,res代表响应。req.url即我们请求的地址这里是个字符串我们必须通过 Url.parse转换为真实的地址形式,转化为了真实地址之后就会打印出来一个对象。
不考虑我们后面写的响应,我们如果这样子去访问
最终的打印结果就会是这样子。因此我们如果想获取到真实的路径可以访问这个对象里的pathname属性。
3.设置响应
if (reqUrl.pathname === '/') {
res.writeHead(200, { 'Content-Type': 'text/html' })
res.end('<h2>hello world</h2>')
}
这是我们其中的一个响应,首先如果我们直接访问端口而不加任何后缀时,我们会弹出hello world,为了让弹出的数据是html结构,我们在响应头加了响应的状态和响应类型。
else if (reqUrl.pathname === '/user') {
res.writeHead(200, { 'Content-Type': 'application/json' })
res.end(JSON.stringify(data))
这里我们的data是一个自定义的数组,我们必须传入json格式否则会乱码,因此响应头也要规定好我们的响应数据格式。
else if (req.method === 'POST' && reqUrl.pathname === '/login') {
// 拿到前端传递的参数
// 去数据库里面校验该参数合法性
res.end('登陆成功')
当然我们也可以规定请求的方式,必须为method才可以响应。
else {
const _Url = path.resolve(__dirname, 'assets/404.html')
const content = fs.readFileSync(_Url, { encoding: 'utf8' })
// console.log(content);
res.end(content)
}
我们也可以直接去响应返回我们的html文件,我们首先获取到当前文件所在文件夹的路径然后和html文件进行路径拼接,最后读到这个文件。因为响应的html文件会被自动解析,因此不需要我们去设置响应头。
4. 优雅的koa
上面的http方式必然会复杂且不优雅,因此我们引入koa和koa-router进行构建web服务。
const Koa = require('koa')
const app = new Koa()
const main = (ctx) => {
ctx.body = 'hello world'
}
app.use(main)
app.listen(3001, () => {
console.log('项目已经启动');
})
我们先进行一个简单的测试,这样子构建的web服务,不管我们访问的端口是什么,最终都会打印hello world。
那要是我们要设置多个响应呢?这就涉及到了koa中的路由。
我们新建立一个路由文件。
const router = require('koa-router')()
router.get('/user', (ctx) => {
ctx.body = {
name: '艾总',
sex: 'boy'
}
})
router.get('/home', (ctx) => {
ctx.body = '艾总'
})
module.exports = router
首先引入并实例化得到一个koa对象,然后调用get方法书写响应结果,最后进行抛出。
const router = require('./router/user.js')
const Koa = require('koa')
const app = new Koa()
app.use(router.routes())
app.listen(3001, () => {
console.log('项目已经启动');
})
然后我们去引入这个router对象,然后调用routes()方法使得所有路由生效。
最后我们的结果就会成功打印。
转载自:https://juejin.cn/post/7387992438297968640