node09---中间件

简介:
如果我的的get、post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了。
如果想往下匹配的话,那么需要写next()
1app.get("/",function(req,res,next){
2    console.log("1");
3    next();
4});
5
6app.get("/",function(req,res){
7    console.log("2");
8});

下面两个路由,感觉没有关系:
1app.get("/:username/:id",function(req,res){
2    console.log("1");
3    res.send("用户信息" + req.params.username);
4});
5
6app.get("/admin/login",function(req,res){
7    console.log("2");
8    res.send("管理员登录");
9});
但是实际上冲突了,因为admin可以当做用户名 login可以当做id。

解决方法1:交换位置。 也就是说,express中所有的路由(中间件)的顺序至关重要。
匹配上第一个,就不会往下匹配了。 具体的往上写,抽象的往下写。
1app.get("/admin/login",function(req,res){
2    console.log("2");
3    res.send("管理员登录");
4});
5
6app.get("/:username/:id",function(req,res){
7    console.log("1");
8    res.send("用户信息" + req.params.username);
9});
报错,因为send了两次。
解决方法2: 
1app.get("/:username/:id",function(req,res,next){
2    var username = req.params.username;
3    //检索数据库,如果username不存在,那么next()
4    if(检索数据库){
5        console.log("1");
6        res.send("用户信息");
7    }else{
8        next();
9    }
10});
11
12app.get("/admin/login",function(req,res){
13    console.log("2");
14    res.send("管理员登录");
15});

路由get、post这些东西,就是中间件,中间件讲究顺序,匹配上第一个之后,就不会往后匹配了。next函数才能够继续往后匹配。
--------------------------------------------------------------------------------
app.use()也是一个中间件。与get、post不同的是,他的网址不是精确匹配的。而是能够有小文件夹拓展的。
比如网址:  http://127.0.0.1:3000/admin/aa/bb/cc/dd
1app.use("/admin",function(req,res){ 
2    res.write(req.originalUrl + "\n");   //    /admin/aa/bb/cc/dd
3    res.write(req.baseUrl + "\n");  //   /admin
4    res.write(req.path + "\n");   //    /aa/bb/cc/dd
5    res.end("你好");
6});

如果写一个/
1//当你不写路径的时候,实际上就相当于"/",就是所有网址
2app.use(function(req,res,next){
3    console.log(new Date());
4    next();
5});

app.use()就给了我们增加一些特定功能的便利场所。
实际上app.use()的东西,基本上都从第三方能得到。


● 大多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染。如果不想使用views文件夹,想自己设置文件夹名字,那么app.set("views","aaaa");
● 如果想写一个快速测试页,当然可以使用res.send()。这个函数将根据内容,自动帮我们设置了Content-Type头部和200状态码。send()只能用一次,和end一样。和end不一样在哪里?能够自动设置MIME类型。
● 如果想使用不同的状态码,可以:
    res.status(404).send('Sorry, we cannot find that!');
● 如果想使用不同的Content-Type,可以:
    res.set('Content-Type', 'text/html');
复制代码

06.js

复制代码
/**
 * Created by Danny on 2015/9/22 10:47.
 */
var http = require("http");

// 这个语句,就在打开服务器的时候,执行一次。
// 每次用户访问的时候,不执行这个语句
var a = 100;

var server = http.createServer(function(req,res){
    // 用户访问的时候,执行这里的语句:
    a++;
    res.end(a.toString());
});

server.listen(3000,"127.0.0.1");
复制代码

07.js

复制代码
/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");

var app = express();

var a = 100;

//路由从上往下找,找到就不向下找了,
app.get("/:username/:id",function(req,res,next){
    var username = req.params.username;
    //检索数据库,如果username不存在,那么next()
    if(检索数据库){
        console.log("1");
        res.send("用户信息");
    }else{
        next();//继续向下找匹配的路由
    }
});

app.get("/admin/login",function(req,res){
    console.log("2");
    res.send("管理员登录");
});


app.listen(3000);
复制代码

08.js

复制代码
/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");

var app = express();

//当你不写路径的时候,实际上就相当于"/",就是所有网址
app.use(function(req,res,next){
    console.log(new Date());
    next();
});

//http://localhost:3000/haha/ssss是匹配不了的
app.get("/haha",function(req,res){
    console.log("哈哈");
});
//http://127.0.0.1:3000/admin/aa/bb/cc/dd
app.use("/admin",function(req,res){
    res.write(req.originalUrl + "\n");//    /admin/aa/bb/cc/dd
    res.write(req.baseUrl + "\n");//   /admin
    res.write(req.path + "\n");
    res.end("你好");
});

app.listen(3000);
复制代码

09.js

复制代码
/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");
var fs = require("fs");

var app = express();

//当你不写路径的时候,实际上就相当于"/",就是所有网址
app.use(haha);

app.get("/admin",function(req,res){
    res.send("管理员");
})

app.listen(3000);

function haha(req,res,next){
    var filePath = req.originalUrl;
    //根据当前的网址,读取public文件夹中的文件
    //如果有这个文件,那么渲染这个文件
    //如果没有这个文件,那么next();
    fs.readFile("./public/" + filePath,function(err,data){
        if(err){
            //文件不存在
            next();
            return;
        }
        res.send(data.toString());
    });
}
复制代码

10.js

复制代码
/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");

var app = express();

//静态服务,一般静态资源往上写。不执行next();
app.use("/jingtai",express.static("./public"));

//新的路由
app.get("/images",function(req,res){
    res.send("哈哈");
});

//会自动识别err参数,如果有,那么就这个函数能捕获err
app.use(function(req,res){
    res.status(404).send("没有这个页面!");
});

app.listen(3000);
复制代码

11.js

复制代码
/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");
var app = express();
app.set("views","aaaa");//如果不想使用views文件夹,想自己设置文件夹名字,
app.set("view engine","ejs");

app.get("/",function(req,res){
    res.render("haha",{news:[]});
});

app.get("/check",function(req,res){
    res.send({
        "user" : "ok"
    });
});

app.listen(3000);
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7039939.html,如需转载请自行联系原作者

相关文章
|
开发框架 JavaScript 中间件
中间件应用Koa.js(Node.js)
【5月更文挑战第3天】我们添加了两个中间件。第一个中间件记录请求的开始时间,并在下一个中间件执行完毕后计算并打印出请求的总时间。第二个中间件与之前的示例相同,它设置响应体为 "Hello World"
215 6
中间件应用Koa.js(Node.js)
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第36天】在探索Node.js的奥秘之旅中,中间件的概念如同魔法一般,它让复杂的请求处理变得优雅而高效。本文将带你领略这一机制的魅力,从概念到实践,一步步揭示如何利用中间件简化和增强你的应用。
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
231 1
|
JSON JavaScript 中间件
深入浅出Node.js中间件机制
本文将带你探索Node.js中一个核心概念——中间件机制。我们将通过浅显的语言和生动的比喻,揭示中间件如何作为请求和响应之间的“交通枢纽”,在应用程序中起到至关重要的作用。从基础原理到实际应用,你将了解到中间件不仅简化了代码结构,还提高了开发效率,是Node.js开发不可或缺的一部分。
276 1
|
JavaScript 前端开发 中间件
深入浅出Node.js中间件模式
【9月更文挑战第13天】本文将带你领略Node.js中间件模式的魅力,从概念到实战,一步步揭示如何利用这一强大工具简化和增强你的Web应用。我们将通过实际代码示例,展示中间件如何在不修改原有代码的情况下,为请求处理流程添加功能层。无论你是前端还是后端开发者,这篇文章都将为你打开一扇通往更高效、更可维护代码的大门。
|
设计模式 JavaScript 中间件
深入浅出Node.js中间件机制
【8月更文挑战第31天】在Node.js的世界里,中间件如同魔法般存在,它让复杂的请求处理变得井然有序。本文将带你领略中间件的奥秘,从原理到实战,一步步揭开它的神秘面纱。你将学会如何运用中间件来构建强大而灵活的后端应用,就像拼乐高一样有趣。
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第4天】在探索Node.js的海洋中,中间件机制犹如一座灯塔,为开发者指引方向。本文将带你一探究竟,从浅入深地理解这一核心概念。我们将通过生动的比喻和实际代码示例,揭示中间件如何在请求和响应之间搭建桥梁,实现功能的扩展与定制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
274 0
|
JavaScript 中间件 API
中间件应用Express.js(Node.js)
【5月更文挑战第3天】我们定义了一个名为 `logger` 的中间件函数。它接受请求对象、响应对象以及下一个中间件函数作为参数。当接收到请求时,它会打印出请求的 HTTP 方法和 URL,然后调用 `next()` 函数来将控制权传递给下一个中间件或路由处理器。我们使用 `app.use()` 方法将 `logger` 中间件添加到了应用级别的中间件堆栈中,这意味着它将对所有请求生效。
220 3
中间件应用Express.js(Node.js)
|
JavaScript 中间件 开发者
深入浅出Node.js中间件机制
【8月更文挑战第31天】本文将带你领略Node.js中间件的奥秘,通过直观的案例分析,揭示其背后的设计哲学。你将学会如何运用中间件构建强大而灵活的后端应用,以及在面对复杂业务逻辑时如何保持代码的清晰与高效。

热门文章

最新文章