普通用法
const http = require('http');
// const Buffer = require('buffer');
const querystring = require('querystring');
const url = require('url');
// let s = url.parse('http://localhost:3000/abc?a=1&b=2');
// console.log(s);
//resful风格
// /user get/user post/user put/user delete
let server = http.createServer((req,res)=>{
//req.url/headers/method req.on('data')
//req.white end setHeader statusCode
let {pathname,query} = url.parse(req.url,true);
console.log(pathname,query);
let method = req.method.toLowerCase();
console.log(method);
let headers = req.headers;
console.log(headers);
let arr = [];
req.on('data',(chunk)=>{
arr.push(chunk);
});
req.on('end',()=>{
//a=1&b=2
let str = Buffer.concat(arr).toString();
if(req.headers['content-type']==='application/x-www-form-urlencoded'){
let obj = querystring.parse(str);
res.setHeader('Content-Type','application/json;charset=utf8')
res.end(JSON.stringify(obj));
}
})
});
server.listen(3000);
处理静态文件
let http = require('http');
let querystring = require('querystring');
let url = require('url');
let fs = require('mz/fs');
let path = require('path');
let mime = require('mime'); //第三方模块
//一般服务端 会处理两种类型 静态的 html css
//动态数据 ajax 获取
// 路由 就是根据 不同的path 返回不同的内容
class Server{
async handleRequest(req,res){
let {pathname} = url.parse(req.url,true);
let absPath = path.join(__dirname,pathname);
//先判断是否是调用的接口 /user get/post/delete/put
let method = req.method.toLowerCase();
//http 无状态的 cookie xss攻击
let originList = [
'http://127.0.0.1:63341',
'http://127.0.0.1:63342',
'http://127.0.0.1:63343',
]
if(originList.includes(req.headers.origin)){
res.setHeader('Access-Control-Allow-Origin',req.headers.origin);
}
res.setHeader('Access-Control-Allow-Methods','GET,PUT,DELETE,OPTIONS,POST');
res.setHeader('Access-Control-Allow-Headers','Content-Type,token');
res.setHeader('Access-Control-Max-Age','10');
//允许前端带cookie
res.setHeader('Access-Control-Allow-Credentials',true);
if(method==='options'){
res.end();
}
console.log(req.headers);
switch(pathname){
case '/userList':
if(method === 'get'){
res.setHeader('Content-Type','application/json');
res.end(JSON.stringify({name:'zf'}));
}
if(method === 'put'){
res.setHeader('Content-Type','application/json');
res.end(JSON.stringify({name:'zf'}));
}
return;
}
try{
let statObj = await fs.stat(absPath);
if(statObj.isDirectory()){
let realPath = path.join(absPath,'index.html');
await fs.access(realPath);
this.sendFile(realPath,res);
}else{
this.sendFile(absPath,res);
}
}catch(e){
console.log(e);
this.sendError(res,e);
}
}
sendFile(absPath,res){
res.setHeader('Content-Type',mime.getType(absPath));
fs.createReadStream(absPath).pipe(res);
}
sendError(res,err){
res.statusCode = 404;
res.end('not found');
return;
}
start(port){
let server = http.createServer(this.handleRequest.bind(this));
server.listen(port);
}
}
let server = new Server();
server.start(3000);
// fs.stat(path.resolve(__dirname,'a'),function (err,statObj) {
// console.log(err);
// console.log(statObj.isDirectory())
// });
// let server = http.createServer((req,res)=>{
// let {pathname} = url.parse(req.url,true);// query a=1&b=2 {a:1,b:2}
// let absPath = path.join(__dirname,pathname);// /abc
// fs.stat(absPath,(err,statObj)=>{
// if(err){
// res.statusCode = 404;
// res.end('Not found');
// return;
// }
// if(statObj.isFile()){
// // /1.css =>text/css 1.png img/png
// res.setHeader('Content-Type',mime.getType(absPath)+';charset=utf-8');
// fs.createReadStream(absPath).pipe(res);
// //readfile readstream.pipe
// }else{
// //如果是文件夹,就去文件夹下找 index.html
// let realPath = path.join(absPath,'index.html');
// fs.access(realPath,(err)=>{
// if(err){
// res.statusCode = 404;
// res.end('Not found');
// return;
// }
// res.setHeader('Content-Type','text/html;charset=utf-8');
// fs.createReadStream(realPath).pipe(res);
// });
// }
// });
// // if(statObj.isFile()){
// // fs.readFile(absPath,(err,data=>{
// //
// // }))
// // }
// //fs.access 判断文件是否存在 fs.stat
//
// });
// server.listen(3000);