Nodejs express 学习

快速入门:

# 快速初始化Npm
npm init -y

# 安装全局express脚手架: https://github.com/expressjs/generator
npm install -g express-genertator 

# 安装项目express
npm install express --save-dev

# 使用脚手架快速构建一个依赖于sass(styl、less)的项目
express -c sass my-application# 安装项目依赖
cd express && npm install

# 开启项目
DEBUG-my-application ./bin/www

安装依赖的过程中,如果你是window用户,可能会出现类似 node-sass 等等这样那样的环境或依赖问题导致编译失败。

请先安装windows-build-tools. 然后重试

# github地址
https://github.com/felixrieseberg/windows-build-tools

# 安装命令(使用管理员运行powershell / cmd运行以下代码)
npm install --global --production windows-build-tools

如果一切顺利,开启任意浏览器进入 http://localhost:3000 查看:

接下来,我们就从脚手架生成的代码来学习


补充: 每次修改nodejs的源码(除了jade、pug、ejs等模板引擎),都需要重新启动app.js才能生效。

我们可以使用 supervisor 来帮助我们自动重启应用。 npm install supervisor -g 

你怎么通过node启动应用的,就换成使用supervisor启动即可。

# before 
node app

# after
supervisor app

1、Express核心:路由

# app.js
var
index = require('./routes/index'); var users = require('./routes/users'); app.use('/', index); app.use('/users', users);

打开 http://localhost:3000/ 和 http://localhost:3000/users 可以看到对应的界面。我们也可以自己写一个中间件试试

// 试试水
app.use('/about', function (req,rep,next) {
  rep.send("fuck you about");
})

访问 http://localhost:3000/about

补充:这里有个神坑

# app.js
app.use('/reg', reg);

# routes/reg.js
router.get('/reg', function(req, res, next) {
    res.render('reg', { title: 'Express' });
});
当我们访问 http://localhost:3000 时,会发现显示404。原因是什么呢?
其实只要把reg.js中的 router.get('/reg', ...) 改为 router.get('/', ...) 即可。
因为前者索引的地址为 http://localhost:3000/reg/reg 而后者才是我们想要实现的路由。可以试试


  

2、Express核心:中间件

app.js中的每一行代码几乎都是中间件:app.use(<middleware>)

1、logger: 会不停的在控制台打印请求输出日志

2、bodyParser: 解析HTTP请求

3、cookieParser: 解析Cookie数据

...


3、不使用脚手架、生成器、中间件、高级模块。照样可以快速的构建express应用

  • 创建文件结构和目录、文件
  • NPM初始化
  • 依赖声明
  • app.js
  • jade
  • 运行node服务
# 创建文件夹和文件
mkdir views db public routes && touch app.js && cd views && touch index.jade

# 初始化npm 和 安装依赖 npm init
-y && npm install express jade stylus mongoskin --save

app.js

var express =require('express');
var http = require('http');
var path = require('path');

var app = express();

app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.all('*', function (req,res) {
  res.render('index', {msg: "welcome to my blogs!"})
})

http.createServer(app).listen(app.get('port'), function () {
    console.log("express server listeng on port" + app.get('port'));
});

index.jade

h1 hello
p #{msg}

node app 运行服务


4、使用 Mocha + Expect.js 进行 BDD 测试

目标: 通过mocha + 断言库 对express的启动服务功能进行单元测试

# 创建测试目录和测试文件
mkdir tests && touch index.test.js

# 安装相关依赖
npm install expect.js mocha superagent --save

# 安装全局Mocha
npm install mocha -g 

# expect.js github 和 API手册
https://github.com/Automattic/expect.js

修改 app.js 的代码以便进行单元测试

// http.createServer(app).listen(app.get('port'), function () {
//     console.log("express server listeng on port" + app.get('port'));
// });

var server = http.createServer(app);

var boot = function () {
    server.listen(app.get('port'), function () {
        console.log('express server listening on port: ' + app.get('port'))
    })
}

var shutdown = function () {
    server.close();
}

if (require.main === module) {
    boot()
} else {
    console.log("Running app as a module");
    exports.boot = boot;
    exports.shutdown = shutdown;
    exports.port = app.get('port')
}

编写测试用例:tests / index.test.js

var boot = require('../app').boot;
var shutdown = require('../app').shutdown;
var port = require('../app').port;
// http请求库
var superagent = require('superagent');
// 注意这个库的全名必须带.js
var expect = require('expect.js');
describe('server', function () {
    before(function () {
        boot();
    });

    describe('homepage', function () {
        it ('should respond to GET', function (done) {
            superagent.get('http://localhost:' + port)
                      .end(function (err, res) {
                            expect(res.status).to.equal(200);
                            done()
                      })
        })
    })

    after (function () {
        shutdown()
    }) 
})

运行测试用例: mocha tests/index.test.js


5、单独使用和学习jade. 

http://www.cnblogs.com/CyLee/p/7229125.html

6、继续回到脚手架,通过脚手架学习

(1)req.query:处理get请求,获取get的请求参数

(2)req.params: 处理/:xxx形式的get或post请求,获取get/post的请求参数

(3)rep.bodu:处理Post请求,获取Post请求体

(4)rep.param():处理get和post请求

7、使用github + express登录

1、打开github并且登录,在右上角个人信息中选择Settings -> Developer settings -> OAuth applications -> Register a new application

回到项目中,安装 passport 和 passport-github 

npm install passport-github passport --save-dev

在项目的入口app.js代码中,加入如下代码块

const passport = require('passport')
const GithubStrategy = require('passport-github').Strategy

const app = express()
app.use('/login',  require('./routes/login')) app.use(passport.initialize())
// 初始化passport if (app.get('env') === 'development') { passport.use(new GithubStrategy({ clientID: "e50400ce682488d87b71", clientSecret: "13e406e42b4578ab600c93df8e059bd80a3205b8", callbackURL: "http://localhost:3000/login/github/callback" }, function (accessToken, refreshToken, profile, done) { done(null, profile); })) }

进入/routes/login.js中,加入如下代码块.

const passport = require('passport')
router.get('/github', passport.authenticate('github', {session: false}))
router.get('/github/callback',  passport.authenticate('github', {
      session: false,
      failureRedirect: '/login',
      successFlash: '登录成功'
    }),
    function (req, res, next) {
      req.session.user = {
        name: req.user.username,
        head: "http://gravatar.com/avatar/" + req.user._json.gravatar_id + "?s=48"
      };
      res.redirect('/')
    }
)

由于我的项目直接使用了express的session功能,所以禁掉了Passport的session功能。

Passport 默认会将用户信息存储在req.user中。这里我们获取到了用户的头像("http://gravatar.com/avatar/" + req.user._json.gravatar_id + "?s=48") 和 用户名 (req.user.username)。并且加入到session中。然后跳转到首页。

就这么简单

持续更新知识点...

原文地址:https://www.cnblogs.com/CyLee/p/7207294.html