NodeJS路由及请求参数解析

node路由的使用和GET及POST方法的请求参数解析

Posted by wang chong on January 23, 2019

什么是路由

简单的说,把一个总路线分成多个方向,通过调用不同方向的标签,执行不同的程序。

路由表示 controller/action

一个浏览器网址的ur可能是这样的

www.ctomorrow.top/about/phone

这其中的/about/phone就构成了一个路由,about是相应的控制器,action是对应的控制ID。

路由

当我们在浏览器地址栏输入地址访问页面的时候,一个完整的地址可能是这样的:协议://域名:端口:路由?路由参数

我们先来实现一个路由

创建一个http模块用于创建http服务

const http = require("http");
const url = require('url'); //引入url模块进行url解析

function start(router){
    const onRequest =(req,res) => {
        //获取路由地址
        let pathname = url.parse(req.url).pathname;
        res.writeHead(200,{
            'Content-Type' : 'text/plain;charset=utf8',
        })
    }
    http.createServer(onRequest).listen(8080);
}
exports.start =start;

创建主模块中调用http模块

const http = require('./http');
http.start();

创建route模块来进行不同路由的管理,不同的路由输出不同的信息。

function route(pathname,res){
    console.log(pathname);
    if(pathname == '/'){
        res.write('欢迎来到首页');
    }else if(pathname == '/a/g'){
        res.write('欢迎来到/a/g');
    }else {
        res.write(`您访问的${pathname}不存在!`);
    }
    res.end();
    
}

exports.route = route;

在主模块中调用路由,并把路由传入http模块调用

const http = require('./http');
const router = require('./route');
http.start(router.route);

在http模块中,把路由地址传入路由模块。

const http = require("http");
const url = require('url');

function start(router){
    const onRequest =(req,res) => {
        let pathname = url.parse(req.url).pathname;
        res.writeHead(200,{
            'Content-Type' : 'text/plain;charset=utf8',
        })
        //加上这一句
        router(pathname,res)
    }
    http.createServer(onRequest).listen(8080);
}
exports.start =start;

请求参数解析

GET请求

由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此可以手动解析后面的内容作为GET请求的参数。

通过使用ur和util模块来输出

const url = require('url');
const util = require('util');
const http = requier('http');

http.createServer((req,res)=>{
    //util的inspec方法是格式化输出
    //url.parse是对url进行解析
    console.log(util.inspect(url.parse(req.url,true)));
}).listen(8080);
Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '',
  query: {},
  pathname: '/favicon.ico',
  path: '/favicon.ico',
  href: '/favicon.ico' }

POST请求

POST请求的内容全部的都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。比如上传文件,而很多时候我们可能不需要理会请求体中的内容,恶意的POST请求会大大耗费服务器的资源,所有nodejs默认是不会解析请求体的。只有当需要的时候,手动来做。

通过querystring模块来解析POST请求

const http = require('http');
const querystring = require('querystring');
const util = require('util');
http.createServer((req,res) => {
    var post = '';      //用于暂存请求体的内容
    req.on('data',(chunk) => {
        //通过req的data事件监听函数,每当接受到请求体的数据,就累加到变量中
        post += chunk;
    })
    req.on('end',() => {
        //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
        post = querystring.parse(post);
        res.end(util.inspect(post));
    })
})