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

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

  1. const express = require('express');
  2. const bodyParser = require('body-parser');
  3. const multer = require('multer');
  4. const fs = require('fs');
  5.  
  6. const cookieParser = require('cookie-parser');
  7. const cookieSession = require('cookie-session');
  8.  
  9. const server = express();
  10. server.listen(8088);
  11.  
  12. //post(格式是x-www-form-urlencoded)回来的data要先用body-parser处理
  13. server.use(bodyParser.urlencoded({}));
  14. //post(格式是multipart/form-data)用multer处理,文件自动保存,文字留在req.body
  15. let multerObj = multer({dest:'./upload/'});
  16. server.use(multerObj.any());
  17.  
  18. //get接口 获取参数用req.query(express写好了)
  19. server.get('/aaa',(req,res,next)=>{
  20. console.log(req.query);
  21. res.send('6666');
  22. })
  23.  
  24. //post接口(两种格式都一样)获取参数用req.query和req.body,mutipart格式post的文件已经被储存
  25. server.post('/getData',(req,res,next)=>{
  26. console.log(req.query);
  27. //body-parser会帮你把数据存放在req.body中
  28. console.log(req.body);
  29. res.send({code:0,msg:`接受到来自你的数据:${JSON.stringify(req.body)}`});
  30. })
  31.  
  32. //有时候我们需要把文件带上我们的扩展名
  33. server.post('/upload',(req,res,next)=>{
  34. console.log(req.files);
  35. let i = 0;
  36. _next();
  37. function _next(){
  38. let file = req.files[i];
  39. let newName = file.path+path.extname(file.originalname);
  40. fs.rename(file.path,newName,err=>{
  41. if(err){
  42. res.status(500).send(`文件${file.originalname}上传失败~~`);
  43. }else{
  44. if(i<req.files.length-1){
  45. i++;
  46. _next();
  47. }
  48. }
  49. })
  50. }
  51. res.send('ok');
  52. })
  53.  
  54. //sendFile express内置的发送文件方法,status 相当于原生的writeHeader
  55. server.get('/text',(req,res,next)=>{
  56. if(req.query.pass == '123456'){
  57.     res.sendFile(path.resolve('./static/1.txt'));
  58. }else{
  59.     res.status(403).send('密码错误喔~~');
  60. }
  61. })
  62.  
  63. //redirect express内置的重定向方法
  64. server.get('/bilibili',(req,res,next)=>{
  65. res.redirect('https://www.bilibili.com');
  66. })
  1. //express里可以用:跟参数
    router.use('/bilibili/:a',(req,res,next)=>{
    //通过params.a获取a,这种多用于重用该接口,就是例如'/bilibili/home'和'/bilibili/links'都是用当前的接口
     let a = req.params.a;
    });
  1. // express.static是express内置的读取静态文件的中间件 // express.static就是利用req.url的pathname在www下用fs读取文件流,然后rs.pipe(res) server.use(express.static('www'));


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

  1. const fs = require('fs');
  2. const url = require('url');
  3.  
  4. module.exports = function(req,res,next){
  5. let time = new Date().toGMTString();
  6. let pathname = url.parse(req.url,true).pathname;
  7. let method = req.method;
  8. let data = `[${time}] ${pathname} ${method}\n`;
  9. //fs.appendFile用来往文件里面添加文字
  10. fs.appendFile('./log/log.txt',data,err=>{
  11. if(err){
  12. console.log('写入日志错误');
  13. }
  14. })
  15. next();
  16. }

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

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

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

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

下面是路由页的内容:

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

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

node框架express的更多相关文章

  1. node框架express里面静态文件中间件express.static,根据路径名查找文件

    - 是express框架下的一个方法,可以根据请求路径名查找某个文件下文件名字和路径名相同的文件 - 3.X里面有20多个中间件,但是在4.X里面 只保留了express.static - 语法 ex ...

  2. Node.js Express 框架学习

    转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...

  3. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  4. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

  5. node.js框架express的安装

    node.js框架express的安装 首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后进入此目录并将其作为当前工作目录. $ mkdir myapp $ cd myapp 通 ...

  6. node.js Web应用框架Express入门指南

    node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ...

  7. Node.js的框架-express

    Node.js的框架 express 是第三方的 express const express=require('express'); const app=express(); const PORT=3 ...

  8. 2.node。框架express

    node.js就是内置的谷歌V8引擎,封装了一些对文件操作,http请求处理的方法 使你能够用js来写后端代码 用node.js开发脱离浏览器的js程序,主要用于工具活着服务器,比如文件处理. 用最流 ...

  9. node.js express mvc轻量级框架实践

    本文记录的是笔者最近抽私下时间给朋友做的一个时时彩自动下注系统,比较简单,主要也是为了学习一下node.js. 其实逻辑没什么可以深谈的,主要是想说说这套代码结构.结构如下图: js的代码比较难以维护 ...

随机推荐

  1. MySQL的sum()函数

    如下图,这是一个关于用户参加活动,每个活动会给这位用户评分的一个表: 用户1参加了A活动,评分100: 用户2参加了B活动,评分98,又参加了D活动,评分10: 用户3参加了C活动,评分99 需求:把 ...

  2. xx-net连接教程

    第一步:安装xx-net 在github上下载xx-net,网址 解压后点击运行start.bat文件,此时会提醒是不信任的文件,此时在系统偏好设置里的安全性与隐私去设置让它能打开. 第二步:安装Sw ...

  3. 17.HTML

    HTML简介 htyper text markup language  即超文本标记语言. 超文本: 就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 标准模板 <!DOCTYPE ...

  4. redis缓存的应用详解

    在现在的很多项目,基本上都需要引入缓存机制,那么缓存到底是什么呢? 缓存  也就是数据交互的缓冲区  Cache 在java-web项目中实现缓存,也就是需要首先把数据库需要用到的数据备份一份作为副本 ...

  5. 微信小程序-weui实例代码提取

    搜索框 对应代码如下: wxss文件 <view class="page"> <view class="page__hd"> <v ...

  6. Problem : 1412 ( {A} + {B} )

    //集合中元素是不会重复的,所以完全没有必要将两个集合合并后再进行排序,交换排序的时间效率是O(n^2),将两个集合中的元素分别排序后输出即可.输出格式也非常需要 //注意的.输出一列元素赢以cout ...

  7. Unity3D UGUI窗口拖拽

    在开发UGUI时 我们时常需要做一个窗口拖拽的功能 先上代码 using UnityEngine; using UnityEngine.EventSystems; public class DragW ...

  8. table_rows查询优化

    日常应用运维工作中,Dev或者db本身都需要统计表的行数,以此作为应用或者维护的一个信息参考.也许很多人会忽略select count(*) from table_name类似的sql对数据库性能的影 ...

  9. MYSQL汇总

    一.1.1 MYSQL 一.1.1.1 基础特性 1)性能卓越,服务稳定,很少出现异常宕机: 2)开放源代码且无版权制约,自主性强,使用成本低: 3)历史悠久,社区及用户非常活跃,遇到问题,可快速获得 ...

  10. .Net小白的大学四年,内含面经

    大家好 我是码农阿宇,和博客园的广大兄弟一样,我们都喜欢.Net,但是你们是985/211,而我江西一所普通得不能再普通的二本大学---九江学院,大四毕业在即,英语四级未过(为什么强调这一点?见文末- ...