Node_Express

装置

npm install --save express

基础运用

//援用express
var express = require('express');

//建立app
var app = express();

//排列中间件
app.get('/',function( req,res ){
    res.send('index');
});

app.get('/new/:id',function( req,res ){
    res.send('news'+ res.params.id);
});

//开启效劳器,监听端口
app.listen(3000);

路由

express 路由

//路由小写和大写都能够。
var express = require('express');

var app = express();

app.get('/',function( req,res ) {
    res.send('get要求');
});
app.post('/',function( req,res ){   
    res.send('post要求');    
});
app.listen(1221);

get和post要求都能够

app.all('/',function( req,res ){
    res.send('get&post');
});
// 更引荐冒号写法
app.get('/student/:id',function( req,res ){});
app.get('/:username/:id',function( req,res ){ res.write(username); res.end(id) });

有字符串正则体系

// 婚配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});

// 婚配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
  res.send('ab+cd');
});

// 婚配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
  res.send('ab*cd');
});

// 婚配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

正则表达式

// 婚配任何途径中含有 a 的途径:
app.get(/a/, function(req, res) {
  res.send('/a/');
});
// 路由中的正则表达式,能够运用分组捕捉,递次中运用req.params[0],req.params[1]来猎取
app.get(/student([\d]{1})\/class([\d]{2})$/,function( req,res ){
    console.log( req.params[0],req.params[1] );
});

表单提交

表单提交到自身页面 // restful 路由设想

/* 
观点:
    /student 
        get // 读取门生信息    // app.get('/student/:id',function(){});
        add  // 增添门生信息     // app.add('/student/:id',function(){});
        delete // 删除门生信息  // app.delete('/student/:id',function(){});
题目:web网页中,大部分处置惩罚get和psot要求处置惩罚。
别的的效劳,能够是从软件,或许app发出要求。平常restful是提供给app。
*/
              
app.get('/',function( req,res ){
    res.render('form.ejs');
});
app.post('/',function( req,res ){
    res.send('form表单提交');
});

中间件

中间件middleware ,少了一层回调。
一切的中间件,都将作为http.createServer();的回调。

中间件特性:

app.js中的代码,递次实行的时刻运转,用户来了以后,并不实行。中间件中的代码块,每一个用户接见的时刻都邑实行一次。

具有跳楼征象,从上往下走,婚配一个就实行,而不会实行第二个。

app.get('/',function( req,res ){ res.send('A') });        
app.get('/',function( req,res ){ res.send('B') });     //实行A,而不会实行B

中间件的回调函数中有next参数,示意继承实行下一个婚配的中间件。 //应用next(),用两段小递次,来同时处置惩罚同一个要求。 把营业离开。 next() , 影响MVC。

app.get('/',function( req,res,next ){
    res.send( 'A' );
    next();
})

app.get('/',function( req,res,next ){
    res.send( 'B' );
})


//这两个路由,觉得没紧要,实际上争执了。
app.get('/:username/:id',function( req,res ){
    console.log(1);
    res.send('用户信息'+ req.params[username]);
});

app.get('/admin/login',function( req,res ){
    console.log(2);
    res.send('管理员上岸');
});

解决要领

要领1:
调解路由高低位置 //应用婚配就有跳楼征象。 express 中 一切的路由 都是中间件,详细的路由往上写,笼统的往下写

app.get('/admin/login',function( req,res ){ 
    console.log(2);
    res.send('管理员上岸');
});

app.get('/:username/:id',function( req,res ){
    console.log(1);
    res.send('用户信息'+ req.params[username]);
});    

要领2: 婚配到最后,要有终究的路由来婚配于它。

//加上next()以后,婚配两次,已被send()一次,会报错。经由过程数据的推断恰当加next()

app.get('/:username/:id',function( req,res ){
    
    var username = req.paramse.username;
    //检索数据库,假如username不存在,那末才next()
    if( usernma ) {
        console.log(1);
        res.send('用户信息'+ req.params[username]);
    } else {
        next();
    }

});

app.get('/admin/login',function( req,res ){
    console.log(2);
    res.send('管理员上岸');
}); 

app.use()

此时并不会举行任何路由婚配,都是实行。平常处置惩罚404,和整体的返回编码和状况的运用。

// 多个路由都能够婚配
app.use('/admin',function( req,res ){
    console.log(req.originUrl); //  '/admin/new'
    console.log(req.baseUrl);  // 'admin'
    console.log(req.path);  // '/new'
    next();
});
// 任何网址都是 '/' 的拓展
app.use('/',function( req,res ){});
app.use(function( req,res ){}); // 能够不必第一个参数 直接就是 '/',就是一切网址了。
app.use(); //增添一些特定功用的方便场合。
// 实际上app.use(); //基础上都从第三方能取得。  -- 路由递次(落路)
app.use(user);
function user( req,res,next ){      
    var filePath = req.originalUrl;
    fs.readFile('./public/'+filePath,function( err,data ){
        if( err ){
            //文件不存在
            next()
            return ;
    }
        res.send(data.toSting());
    });
}
// 静态效劳
app.use(express.static('./public'));

// 路由的高低关联,很有关联, 是不是婚配第一个,是不是须要next()

// 平常习气把静态效劳写在前头,背面的路由处置惩罚,平常不争执。

 // 返回编码和状况
 app.use(function( req,res,next ){
    
    res.status(200);
    res.set('Content-Type','text/html;charset=utf-8');
    next();

});
//404 
app.use(function( req,res ){
    res.status(404);
    res.send('sorry');
});

render() & send()

大多数情况下,衬着内容用res.render(),将会依据views的模板文件举行衬着,假如不想运用views文件夹,运用别的名字,

app.set('views','static');   
send(); //自动设置了Content-Type 头部和200状况码。和 mime范例。 send() 和 end() 一样。

get & post

get要求的参数在url中,在原生node中,须要运用url模块来辨认参数字符串,在express中,不须要运用url模块。能够直接运用req.query对象。

post要求在express中不能直接取得,必需运用body-parser模块。运用后,将可用req.body取得参数。然则假如表单中含有文件上传,那末照样须要运用formidable模块

post运用到的第三方模块:body-parserformidable

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

// 设置模板
app.set('view engine','ejs');
app.use(bodyParser.urlencoded({ extended: false }));

// router
app.get('/',function( req,res ){
  res.render('form.ejs');
});

app.post('/',function( req,res ){
  console.log(req.body);
}); 

静态化文件

应用expres.static(root); // root 参数指的是静态资本文件地点的根目录。

// app.use要领实际上是将中间件保存在一个数组中,注册路由时,顺次将数组的元素掏出
app.use(express.static('./static'));
app.use('page',epxress.static('./static'));  // page/index.html 

模板引擎

和 express 连系的模板是:jadeejs
(ejs)[https://www.npmjs.com/package…

var express = require('express');
var app = express();

// 设置模板引擎,设置为ejs
app.set('view engine','ejs');

// 路由
app.get('/',function( req,res ){
    //render: 第二个参数是,字典。
    res.render('index.ejs',{
        'name': [ting,daie]
    });
});   
app.listen(1221);

对应的模板为:

<ul>
    <%
        for( var i=0; i<name.length; i++ ){
    %>
        <li><%=name[i]%></li>
    <%
        }
    %>
</ul>

默许的视图文件夹,views。假如不想运用默许的 app.set('views','./shitu');

    原文作者:alogy
    原文地址: https://segmentfault.com/a/1190000005640115
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞