一般node中去获取拼接在url的get参数,需要利用node的内置模块中的queryString
以及url
这两个内置模块。
-
获取get请求中URL路径的参数:
get 请求的数据,是通过url路径传递过来的,通过url.parse()
等方法来解析url路径 获取get请求的数据。
这里有两种处理方法:
一种是直接再去使用fs.parse()
方法去解析出路径上的内容返回key-value集合
另外一种是直接url.parse(req.url, true)
处理同样能得到key-value集合
const http = require('http');
const url = require('url');
const fs = require('querystring');
http.createServer((req, res) => {
/**
* get 请求的数据, 是通过url路径传递过来的
* 通过 url.parse 等方法来解析 url路径 获取get请求的数据
*/
console.log(req.url);
let { query } = url.parse(req.url, false);
console.log(fs.parse(query));
res.end('test')
}).listen(3000, () => console.log('Server port at 3000 start ....'))
图1.png
-
使用包处理静态资源目录:
手动利用node去模仿Apache的映射关系,会使得工作量非常的大,可以使用npm资源包serve-static
处理静态目录的,以及finalhandler
包,官网上的案例非常明显,这两个npm包是配套使用的。
image.png
接着,我们可以在目录下npm init -y
初始化一个package.json依赖内容文件出来
然后终端中安装这两个包npm install finalhandler serve-static
。
为了方便测试,我们在public下创建两个模板文件:
需要注意的是:
在使用静态资源目录,要把静态资源处理放到最后,防止前面进行通配。
const http = require('http');
const url = require('url');
const fs = require('querystring');
// 引入处理静态资源的包
const serveStatic = require('serve-static');
const finalHandler = require('finalhandler');
// 定义静态资源目录
let serve = serveStatic('public', { 'index': ['index.html', 'index.htm']})
http.createServer((req, res) => {
/**
* get 请求的数据, 是通过url路径传递过来的
* 通过 url.parse 等方法来解析 url路径 获取get请求的数据
*/
console.log(req.url);
let { query } = url.parse(req.url, false);
console.log(fs.parse(query));
// 使用静态资源目录,要把静态资源处理,放到最后
// 防止前面进行通配
serve(req, res, finalHandler(req, res));
}).listen(3000, () => console.log('Server port at 3000 start ....'))
图3.png
这样可以发现,类似apache的路径映射就实现了,没有该路径会找不到对应的模块。
-
使用get方式实现学生数据的录入:
利用get请求录入学生信息,实际上的思路就是通过在http://localhost:3000/addStudent端口url上去拼接学生的姓名,年龄以及学校信息后,node中利用pathname去匹配到/addStudent这个新增学生的路由,然后再利用内置的fs模块去实现数据的读写模拟接口录入。
const http = require('http');
const url = require('url');
const qs = require('querystring');
const fs = require('fs');
// 引入处理静态资源的包
const serveStatic = require('serve-static');
const finalHandler = require('finalhandler');
// 定义静态资源目录
let serve = serveStatic('public', { 'index': ['index.html', 'index.htm']})
http.createServer((req, res) => {
/**
* get 请求的数据, 是通过url路径传递过来的
* 通过 url.parse 等方法来解析 url路径 获取get请求的数据
*/
console.log(req.url);
let { query, pathname } = url.parse(req.url, true);
res.setHeader('Content-Type', 'text/html;charset=utf8')
// 1. 匹配路由
if (pathname === '/getStudent') {
res.end('get')
} else if (pathname === '/addStudent') {
// 如果匹配到的是添加学生信息,那么分三步完成:
// 1、获取get路径上的参数信息(也就是学生数据)并重新调整格式
const stu_info = `
学号: ${query.no} \n
姓名: ${query.name} \n
年龄: ${query.age} \n
学校: ${query.school} \n
`
console.log(stu_info)
// 2.对录入信息后 文件的路径进行拼接
const filePath = `./public/student_db/${query.no}.txt`;
// 3.调用fs内置模块进行数据的写入
fs.writeFile(filePath, stu_info, (error, data) => {
if (error) {
res.end('数据录入失败...');
} else {
res.end('数据录入成功...')
}
})
} else {
// 使用静态资源目录,要把静态资源处理,放到最后
// 防止前面进行通配
serve(req, res, finalHandler(req, res));
}
}).listen(3000, () => console.log('Server port at 3000 start ....'))
图4.png
- 利用get方式去查询学生信息:
const http = require('http');
const url = require('url');
const qs = require('querystring');
const fs = require('fs');
// 引入处理静态资源的包
const serveStatic = require('serve-static');
const finalHandler = require('finalhandler');
// 定义静态资源目录
let serve = serveStatic('public', { 'index': ['index.html', 'index.htm']})
http.createServer((req, res) => {
/**
* get 请求的数据, 是通过url路径传递过来的
* 通过 url.parse 等方法来解析 url路径 获取get请求的数据
*/
console.log(req.url);
let { query, pathname } = url.parse(req.url, true);
res.setHeader('Content-Type', 'text/html;charset=utf8')
// 1. 匹配路由
if (pathname === '/getStudent') {
const filePath = `./public/student_db/${query.no}.txt`;
fs.readFile(filePath, (error, data) => {
if (error) {
res.end('数据查询失败...');
} else {
res.end(data.toString());
}
})
} else if (pathname === '/addStudent') {
// 如果匹配到的是添加学生信息,那么分三步完成:
// 1、获取get路径上的参数信息(也就是学生数据)并重新调整格式
const stu_info = `
学号: ${query.no} \n
姓名: ${query.name} \n
年龄: ${query.age} \n
学校: ${query.school} \n
`
console.log(stu_info)
// 2.对录入信息后 文件的路径进行拼接
const filePath = `./public/student_db/${query.no}.txt`;
// 3.调用fs内置模块进行数据的写入
fs.writeFile(filePath, stu_info, (error, data) => {
if (error) {
res.end('数据录入失败...');
} else {
res.end('数据录入成功...')
}
})
} else {
// 使用静态资源目录,要把静态资源处理,放到最后
// 防止前面进行通配
serve(req, res, finalHandler(req, res));
}
}).listen(3000, () => console.log('Server port at 3000 start ....'))
图5.png
-
使用post请求方式操作核心:
post方式的核心就是在于获取数据流的问题,使用req.on()
首先去监听数据流的变化情况,当end触发时,再去写入获取到的数据流。方法类似
http.createServer((req, res) => {
let info = '';
req.on('data', (chunk) => {
info += chunk;
});
req.on('end', () => {
console.log('info: ', info);
})
}).listen(3000, () => console.log('Server port at 3000 start ....'))
网友评论