Nodejs之express学习笔记(1)
写之前,想写一段题外话。</br> 其实作为一个菜鸟,我最大的体会就是:</br> 不是我不想学习,而是不知道怎么学习;不是我不认真学习,而是学了后还是什么都不会的感觉。</br> 其实你请教前辈或者牛人的话,一般都会甩给你一句话:“代码写的少,多写多练“。</br> 前辈,牛人说的都是事实,但当我们去练习但时候,却发现无从下手,一次次的,积极性自然下降。</br> 我们去看别人的代码或者去看项目的api,我们即使时照着别人的代码写一遍又一遍,我们感觉还是不会。</br> 这里面的一个最主要的原因就是-“编程思想”。</br> 因为我们不懂得,为什么要这么写,这么写的好处。因为我们一拿到手的就是牛人写的精炼的代码。</br> 像我们这种还没什么思想的菜鸟,只会明白所以然,却不会明白之所以然。我们可以去思考牛人在想什么。</br> 虽然一个很简单但demo牛人只要几分钟,但我们可能会花上一天的时间,我觉得这个时间是值得的。</br> 我不想总是徘徊在似懂非懂的边缘,我们应该要有更高的追求。</br> 出于上面的一些思考,会有下面的一系列的笔记,我也不知道效果怎么样。</br> 但我们的确实缺少练习,练习不仅仅时照抄,更要学习思想。</br> 实践出真知,大家拭目以待。</br>
回归正题…
下面代码,是我根据express示例里面auth文件,然后自己学习写的。
首先思路,要实现都功能。
1.输入用户名、密码,验证用户名、密码是否正确。
知道功能后,我们开始着手写代码
1.导入相应都模块
2.初始化
3.把view表单文件写好
4.绑定端口,输入地址时,显示相关的页面
5.提交表单,提交的内容,跟密钥进行匹配,根据提交的信息做相关的处理
//第一步 //导入相应的模块 //express Web框架 //body-parser 涉及到页面操作 //hash 密码加密 var express = require("express"); var bodyParser = require('body-parser'); var hash = require('./pass').hash; //第二步 //初始化,生成express对象 //设置模版,需获取表单内容,解析客户端请求的内容 var app = express(); app.set('view engine', 'ejs'); //设置view模版 app.set('views', __dirname + '/views');//设置view模版路径 //解析客户端请求的body中的内容 app.use(bodyParser.urlencoded({ extended: false })); //输入地址跳转 app.get('/', function(req, res){ //指向登入 res.redirect('/login'); }); //输入地址跳转 app.get('/login', function(req, res){ //显示登入页面 res.render('login'); }); //提交表单 //通过authenticate函数,去严重用户名和密码是否正确 app.post('/login',function(req,res){ //req.body.username //req.body.password //导入用户名跟秘密,生成密钥,看是否匹配 authenticate(req.body.username,req.body.password,function(err,user){ //if(err) ; if(user){ console.log("登入成功") }else{ console.log("登入失败") res.render('login') } }) }) //验证已知的用户名密码 var users = { tj:{ "name":'tj' } } //传入密码和回调函数,生产密钥 hash('foobar',function(err,salt,hash){ if(err) throw err; //console.log(salt,hash) users.tj.salt = salt; users.tj.hash = hash; }) function authenticate(name,pass,fn){ var user = users[name]; //console.log(user) if(!user) return fn(new Error('cannot find user')); hash(pass,user.salt,function(err,hash){ if(err) return fn(err) if(user.hash == hash) return fn(null,user); fn(new Error('invalid password')) }) } //绑定端口 if (!module.parent) { app.listen(3000); console.log('Express started on port 3000'); }
//密钥生成相关代码 var crypto = require('crypto'); var len = 128; var iterations = 128000; exports.hash = function(pass,salt,fn){ if(3 == arguments.length){ crypto.pbkdf2(pass,salt,iterations,len,function(err,hash){ fn(err,hash.toString('base64')) }); }else{ //初次生成密钥 fn = salt; crypto.randomBytes(len,function(err,salt){ if(err) return fn(err); salt = salt.toString('base64'); crypto.pbkdf2(pass,salt,iterations,len,function(err,hash){ //返回密钥,并保存。 fn(null,salt,hash.toString('base64')) }) }) } }
//第三步写好表单