- node处理http请求
- 搭建开发环境
- 开发接口
http请求概述
- DNS解析,建立TCP连接,发送http请求。
- server接收到http请求,处理,并返回。
- 客户端接收到返回数据,处理数据(如渲染页面,js)
nodejs处理http请求
- get请求和
querystring
- post请求和
postdata
- 路由
nodejs处理get请求
- get请求,即客户端要向server端获取数据
- 通过
querystring
来传递数据,如a.html?a=100&b=200 - 浏览器直接访问,就发送get请求。
const http = require('http');
const querystring = require('querystring');
const server = http.createServer((req,res)=>{
console.log('method',req.method); //get
const url = req.url;
console.log('url',url);
req.query = querystring.parse(url.split('?')[1]);
console.log('query',req.query);
res.end(JSON.stringify(req.query));
})
server.listen(8080,()=>{
console.log(`server is running `)
});
打印如下:
method GET
url /api/list?author=111
query [Object: null prototype] { author: '111' }
method GET
url /favicon.ico
query [Object: null prototype] {}
nodejs处理post请求
- post请求,即客户端要向server端传递数据
- 通过
postdata
来传递数据 - 浏览器无法直接模拟,需要手写js,或者用postman
const http = require('http');
const server = http.createServer((req,res)=>{
if(req.method == 'POST'){
console.log('req content-type',req.headers['content-type']);
let postData = '';
req.on('data',chunk =>{
postData+=chunk.toString();
})
req.on('end',() =>{
console.log('postData:',postData);
console.log('postData:',typeof postData); //string
res.end('hello world')
})
}
});
server.listen(8000,()=>{
console.log('ok')
})
开发基本分层
bin
---- 基本的搭建服务器app.js
---- 对接口的基本设置router
---- 专门处理路由controller
---- 专门处理/获取数据
第一层 基本的搭建服务器的内容,跟其他业务代码没有任何关系 所以抽离出来
const http = require('http');
const PORT = 8000;
const serverHandle = require('../app');
const server = http.createServer(serverHandle);
server.listen(PORT,()=>{
console.log(`server is running at ${PORT}`);
})
第二层 app.js 对接口的基本设置,setHeader,获取url,path,query,处理get/post和错误接口的设定
const querystring = require('querystring');
const handleBlogRouter = require('./src/router/blog');
const handleUserRouter = require('./src/router/user');
const serverHandle = (req, res) => {
// 设置返回格式 JSON
res.setHeader('Content-type', 'application/json');
// 获取path
const url = req.url;
req.path = url.split('?')[0];
//解析query
req.query = querystring.parse(url.split('?')[1]);
// 处理blog路由
const blogData = handleBlogRouter(req,res);
if(blogData){
res.end(
JSON.stringify(blogData)
)
return
}
// 处理user路由
const userData = handleUserRouter(req,res);
if(userData){
res.end(
JSON.stringify(userData)
)
return
}
// 未命中路由 返回404
res.writeHead('404',{'Content-type':'text/plain'});
res.write('404 Not Found \n');
res.end();
}
module.exports = serverHandle;
第三层 只处理路由 不管处理数据
const {getList} = require('../controller/blog');
const {SeccessModel,ErrorModel} = require('../model/resModel');
const handleBlogRouter = (req,res)=>{
const method = req.method;
// 获取博客列表
if(method == 'GET' && req.path == '/api/blog/list'){
const author = req.query.author || '';
const keyword = req.query.keyword || '';
const listData = getList(author,keyword);
return new SeccessModel(listData)
}
}
module.exports = handleBlogRouter
第四层 只关心数据 不涉及请求 不涉及路由
const getList = (author,keyword)=>{
// 先返回数据格式
return [
{
id:1,
title:'标题A',
content:'内容A',
createTime:1568099678175,
author:'qiufuli'
}
]
}
module.exports = {
getList
}