zl程序教程

您现在的位置是:首页 >  前端

当前栏目

node框架express

Node框架 Express
2023-09-14 09:00:17 时间

见识到原生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}\n`;
  //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);