zoukankan      html  css  js  c++  java
  • node框架express

    见识到原生nodeJs服务器的恶心后,我们来用下简单好用的框架吧~

    服务器无非主要提供接口和静态文件读取,直接上代码:

    const express = require('express');
    const bodyParser = require('body-parser');
    const multer = require('multer');
    const fs = require('fs');
    
    const cookieParser = require('cookie-parser');
    const cookieSession = require('cookie-session');
    
    const server = express();
    server.listen(8088);
    
    //post(格式是x-www-form-urlencoded)回来的data要先用body-parser处理
    server.use(bodyParser.urlencoded({}));
    //post(格式是multipart/form-data)用multer处理,文件自动保存,文字留在req.body let multerObj = multer({dest:'./upload/'}); server.use(multerObj.any()); //get接口 获取参数用req.query(express写好了) server.get('/aaa',(req,res,next)=>{ console.log(req.query); res.send('6666'); }) //post接口(两种格式都一样)获取参数用req.query和req.body,mutipart格式post的文件已经被储存 server.post('/getData',(req,res,next)=>{ console.log(req.query); //body-parser会帮你把数据存放在req.body中 console.log(req.body); res.send({code:0,msg:`接受到来自你的数据:${JSON.stringify(req.body)}`}); }) //有时候我们需要把文件带上我们的扩展名 server.post('/upload',(req,res,next)=>{ console.log(req.files); let i = 0; _next(); function _next(){ let file = req.files[i]; let newName = file.path+path.extname(file.originalname); fs.rename(file.path,newName,err=>{ if(err){ res.status(500).send(`文件${file.originalname}上传失败~~`); }else{ if(i<req.files.length-1){ i++; _next(); } } }) } res.send('ok'); }) //sendFile express内置的发送文件方法,status 相当于原生的writeHeader server.get('/text',(req,res,next)=>{ if(req.query.pass == '123456'){     res.sendFile(path.resolve('./static/1.txt')); }else{     res.status(403).send('密码错误喔~~'); } }) //redirect express内置的重定向方法 server.get('/bilibili',(req,res,next)=>{ res.redirect('https://www.bilibili.com'); })

    //express里可以用:跟参数
    router.use('/bilibili/:a',(req,res,next)=>{
    //通过params.a获取a,这种多用于重用该接口,就是例如'/bilibili/home'和'/bilibili/links'都是用当前的接口
     let a = req.params.a;
    });
    // express.static是express内置的读取静态文件的中间件 // express.static就是利用req.url的pathname在www下用fs读取文件流,然后rs.pipe(res) server.use(express.static('www'));


    其实express的核心是中间件,所谓中间件就是带上req,res和next的函数。例如,我们自定义一个访问日志中间件:

    const fs = require('fs');
    const url = require('url');
    
    module.exports = function(req,res,next){
      let time = new Date().toGMTString();
      let pathname = url.parse(req.url,true).pathname;
      let method = req.method;
      let data = `[${time}] ${pathname} ${method}
    `;
      //fs.appendFile用来往文件里面添加文字
      fs.appendFile('./log/log.txt',data,err=>{
        if(err){
          console.log('写入日志错误');
        }
      })
      next();
    }

    之后可以直接当作中间件使用了:

    const myLogger = require(./myLogger.js);
    
    server.use(myLogger);

    实际上,在实际做项目的时候,我们不都不使用路由, 不然所有的逻辑都写在server.js上实在太乱,而express原生的给我们提供了Route,写法很简单:

    // server.js
    const express = require('express');
    
    const server = express();
    server.listen(8088);
    
    //这里写了两个路由引入,说明'/user'归给User路由管,'/news'归给News路由管
    server.use('/user',require('./Routes/User'));
    server.use('/news',require('./Routes/News'));

    下面是路由页的内容:

    // Routes/User/index.js
    const express = require('express');
    const router = express.Router();
    
    //写法很简单,把router看作server来写就好了
    //只不过和server不同的是根目录变成'localhost:8088/user'罢了
    router.get('/',(req,res,next)=>{
      res.send('user的根目录');
    })
    
    router.get('/login',(req,res,next)=>{
      res.send('user的登陆');
    })
    
    router.get('/reg',(req,res,next)=>{
      res.send('user的注册');
    })
    
    //路由里面可以再有子路由,写法也是一样的
    router.use('/vip',require('./Vip'));
    
    
    module.exports = router;
    
    //-----------------------------------
    
    // Routes/User/Vip/index.js
    const express = require('express');
    const router = express.Router();
    
    //router就可以看成这部分路由的server
    router.get('/',(req,res,next)=>{
      res.send('Vip_user的根目录');
    })
    
    router.get('/tequan',(req,res,next)=>{
      res.send('user的特权页');
    })
    
    module.exports = router;

    news的写法跟user的是一样的,总的来说,用法就是server.use('pathname',Router);

  • 相关阅读:
    (网络编程)基于tcp(粘包问题) udp协议的套接字通信
    (网络编程)理论 原理
    (网络编程) 介绍
    C++开源代码项目汇总
    Facial Landmark Detection
    人脸对齐ASM-AAM-CLM的一些总结
    Ello讲述Haar人脸检测:易懂、很详细、值得围观
    显示形状回归算法(ESR)代码介绍
    百度图像搜索探秘
    人脸特征点检测
  • 原文地址:https://www.cnblogs.com/amiezhang/p/8148725.html
Copyright © 2011-2022 走看看