JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象。而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS就相应提供了fs、http等内置对象。Express作为NodeJS的Web应用框架,可以帮助我们快速开发Web网站。
E:/project> node -vv0.10.30E:/project> npm -v1.4.21E:/project> express -V4.2.0
使用express命令建立工程,并支持ejs:
E:/project> express -e nodejs-demo create : nodejs-demo create : nodejs-demo/package.json create : nodejs-demo/app.js create : nodejs-demo/public create : nodejs-demo/public/javascripts create : nodejs-demo/public/images create : nodejs-demo/public/stylesheets create : nodejs-demo/public/stylesheets/style.CSS create : nodejs-demo/routes create : nodejs-demo/routes/index.js create : nodejs-demo/routes/users.js create : nodejs-demo/views create : nodejs-demo/views/index.ejs create : nodejs-demo/views/error.ejs create : nodejs-demo/bin create : nodejs-demo/bin/www install dependencies: $ cd nodejs-demo && npm install run the app: $ DEBUG=nodejs-demo ./bin/wwwE:/project>
根据提示下载依赖包:
E:/project> cd ./nodejs-demoE:/project/nodejs-demo> npm installnpm WARN deprecated static-favicon@1.0.2: use serve-favicon modulestatic-favicon@1.0.2 node_modules/static-favicondebug@0.7.4 node_modules/debugejs@0.8.8 node_modules/ejscookie-parser@1.0.1 node_modules/cookie-parser├── cookie-signature@1.0.3└── cookie@0.1.0morgan@1.0.1 node_modules/morgan└── bytes@0.3.0body-parser@1.0.2 node_modules/body-parser├── qs@0.6.6├── raw-body@1.1.7 (bytes@1.0.0, string_decoder@0.10.25-1)└── type-is@1.1.0 (mime@1.2.11)express@4.2.0 node_modules/express├── parseurl@1.0.1├── utils-merge@1.0.0├── cookie@0.1.2├── merge-descriptors@0.0.2├── escape-html@1.0.1├── range-parser@1.0.0├── fresh@0.2.2├── cookie-signature@1.0.3├── debug@0.8.1├── methods@1.0.0├── buffer-crc32@0.2.1├── serve-static@1.1.0├── path-to-regexp@0.1.2├── qs@0.6.6├── send@0.3.0 (debug@0.8.0, mime@1.2.11)├── accepts@1.0.1 (negotiator@0.4.7, mime@1.2.11)└── type-is@1.1.0 (mime@1.2.11)E:/project/nodejs-demo>
工程建立成功,启动服务:
E:/project/nodejs-demo> npm start> nodejs-demo@0.0.1 start E:/project/nodejs-demo> node ./bin/www
本地3000端口被打开,在浏览器地址栏输入localhost:3000,访问成功。
E:/project/nodejs-demo> dir 目录: E:/project/nodejs-demoMode LastWriteTime Length Name---- ------------- ------ ----d---- 2014/8/16 21:55 bind---- 2014/8/16 22:03 node_modulesd---- 2014/8/16 21:55 publicd---- 2014/8/16 21:55 routesd---- 2014/8/16 21:55 views-a--- 2014/8/16 21:55 1375 app.js-a--- 2014/8/16 21:55 327 package.json
打开app.js:
1 var express = require('express'); 2 var path = require('path'); 3 var favicon = require('static-favicon'); 4 var logger = require('morgan'); 5 var cookieParser = require('cookie-parser'); 6 var bodyParser = require('body-parser'); 7 8 var routes = require('./routes/index'); 9 var users = require('./routes/users');10 11 var app = express();12 13 // view engine setup14 app.set('views', path.join(__dirname, 'views'));15 app.set('view engine', 'ejs');16 17 app.use(favicon());18 app.use(logger('dev'));19 app.use(bodyParser.json());20 app.use(bodyParser.urlencoded());21 app.use(cookieParser());22 app.use(express.static(path.join(__dirname, 'public')));23 24 app.use('/', routes);25 app.use('/users', users);26 27 /// catch 404 and forward to error handler28 app.use(function(req, res, next) {29 var err = new Error('Not Found');30 err.status = 404;31 next(err);32 });33 34 /// error handlers35 36 // development error handler37 // will print stacktrace38 if (app.get('env') === 'development') {39 app.use(function(err, req, res, next) {40 res.status(err.status || 500);41 res.render('error', {42 message: err.message,43 error: err44 });45 });46 }47 48 // production error handler49 // no stacktraces leaked to user50 app.use(function(err, req, res, next) {51 res.status(err.status || 500);52 res.render('error', {53 message: err.message,54 error: {}55 });56 });57 58 59 module.exports = app;
修改app.js,让ejs模板文件使用扩展名为html的文件:
13 // view engine setup14 app.set('views', path.join(__dirname, 'views'));15 //app.set('view engine', 'ejs');16 app.engine('html', require('ejs').renderFile);17 app.set('view engine', 'html');
修改完成后,重命名views/index.ejs为views/index.html。重启服务,访问成功。
添加bootstrap和jQuery:
E:/project/nodejs-demo> npm install bootstrapbootstrap@3.2.0 node_modules/bootstrapE:/project/nodejs-demo> npm install jqueryjquery@2.1.1 node_modules/jqueryE:/project/nodejs-demo>
接下来,把index.html分成三个部分:
header.html
1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="utf-8">5 <title><%= title %></title>6 <!-- Bootstrap -->7 <link href="/stylesheets/bootstrap.min.css" rel="stylesheet" media="screen">8 </head>9 <body screen_capture_injected="true">
index.html
1 <% include header.html %>2 <h1><%= title %></h1>3 <p>Welcome to <%= title %></p>4 <% include footer.html %>
footer.html
1 <script src="/Javascripts/jquery.min.js"></script>2 <script src="/javascripts/bootstrap.min.js"></script>3 </body>4 </html>
重启服务,访问成功。
登录设计:
访问路径 | 页面 | 描述 |
/ | index.html | 不需要登录,可以直接访问。 |
/home | home.html | 必须用户登录以后,才可以访问。 |
/login | login.html | 登录页面,用户名密码输入正确,自动跳转到home.html。 |
/logout | 无 | 退出登录后,自动跳转到index.html。 |
打开app.js文件,增加路由配置:
26 app.use('/', routes);27 app.use('/users', users);28 app.use('/login', routes);29 app.use('/logout', routes);30 app.use('/home', routes);
打开routes/index.js文件,添加对应方法:
1 var express = require('express'); 2 var router = express.Router(); 3 4 /* GET home page. */ 5 router.get('/', function(req, res) { 6 res.render('index', { title: 'Express' }); 7 }); 8 9 router.route('/login')10 .get(function(req, res) {11 res.render('login', { title: '用户登录' });12 })13 .post(function(req, res) {14 var user={15 username: 'admin',16 passWord: '123456'17 }18 if(req.body.username === user.username && req.body.password === user.password){19 res.redirect('/home');20 }21 res.redirect('/login');22 });23 24 router.get('/logout', function(req, res) {25 res.redirect('/');26 });27 28 router.get('/home', function(req, res)
新闻热点
疑难解答