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);
相关文章
- Node Security
- windows下快速删除node_modules
- [Node.js] Pass command line arguments to node.js
- [Node.js] node-persist: localStorage on the server
- [Whole Web, Node.js, PM2] Restarting your node.js app on code change using pm2
- [Node.js] Creating Demo APIs with json-server
- npm全局安装和非全局安装的区别(node v16.13.1 / npm 8.4.1)
- node-canvas遇到NODE_MODULE_VERSION不一致的问题
- node框架koa
- [Docker] Linking Node.js and MongoDB Containers
- [WASM] Run WebAssembly in Node.js using the node-loader
- [Node.js] Pass command line arguments to node.js
- [Node.js] node-persist: localStorage on the server
- [Node.js] Using npm link to use node modules that are "in progress"
- [Node.js] Level 2 new. Event
- Node.js调用C/C++
- 如何在 SAP CRM WebClient UI 里在 Context node 上下文里访问其他 Context Node 的数据
- Node.js 工具库 BlueBird 的一些例子:map,each 和 some
- Node.js 应用的内存泄漏问题的检测方法
- Node.js:pm2管理进程启动npm run dev和开机自启
- Node.js学习笔记(四)——NodeJS访问MongoDB与MySQL数据库
- Node.js v0.10.31API手冊-控制台
- 浏览器和 Node 中的事件循环有什么区别?