node.js开发网站

npm 是随处可见的 Node 开发包管理器
npm install -g grunt-cli实现了全局安装
npm install -g express-generator

node.js事件驱动编程

程序员必须知道有哪些事件,以及如何处理这些事件。最大的特点是异步回调函数

路由

是指向客户端提供它所发出的请求内容的机制。对于Web的客户端/服务器程序而言,客户端在URL中指明它想要的内容
才能使用express命令
express在出初始化一个项目的时候需要指定模板引擎,默认支持Jade和ejs
**
创建About和404的路由

var  http=require('http');
http.createServer(function(req,res){
    //规范化url、去掉查询字符串、可选的反斜杠、并把他们变成小写
    var path=req.url.replace(/\/?(?:\?.*)?$/,'').toLowerCase();
    switch (path){
        case '':
            res.writeHead(200,{'Content-Type':'text-plain'});
            res.end('Homepage');
            break;
        case '/about':
            res.writeHead(200,{'Content-Type':'text-plain'});
            res.end('About');
            break;
        default :
            res.writeHead(404,{'Content-Type':'text-plain'});
            res.end('Not Found');
            break;
    }
}).listen(3000);

使用了一个函数动态的为服务器创建了多个路由

var http=require('http'),fs=require('fs');
function serveStaticFile(res,path,ContentType,responseCode){
    if(!responseCode)
    {
        responseCode=200;
    }
    //console.log(__dirname)会输出当前helloWorld.js的所在的位置
    //fs的readFile这个函数有两个参数1、文件的路径、2、读取完要执行的函数
    fs.readFile(__dirname+path,function(err,data){
        if(err){
            res.writeHead(500,{'Content-Type':'text/plain'});
            res.end('500-Internal Err');
        }else{
            res.writeHead(responseCode,{'Content-Type':ContentType});
            res.end(data);
        }
    });
}
/*fs.readFile()这是一个异步读取文件的函数,调用这个函数读取指定文件中的内容,读取完之后会执行回调函数function(), 如果文件不存在,或者读取文件时遇到许可权限,或许文件不成功,文件会带着响应码和内容类型发送给客户端*/
http.createServer(function(req,res){
    var path=req.url.replace(/\/?(?:\?.*)?$/,'').toLowerCase();
    switch (path){
    case '':
        serveStaticFile(res,'/public/home.html','text/html');
        break;
    case '/about':
        serveStaticFile(res,'/public/about.html','text/html');
        break;
    default :
        serveStaticFile(res,'/public/about.html','text/html',404);
        break;
    }
}).listen(3000);

创建一个Express命令创建一个网站的基本结构*

*
Express就像是一个脚手架

npm install –save express
安装express
npm install会把指定名称的包安装到node_modules目录下。如果使用了–save选项,还会更新package.json文件
express -t ejs microblog

用express实现的实际上就是一个node.js程序
express的目录结构
node.js开发网站_第1张图片`
对app.js文件的解析
/加载依赖库,原来这个类库都封装在connect中,现在需地注单独加载/
//导入Express模块
var express = require(‘express’);
//文件夹形式的本地模块,功能是为指定的路径组织返回内容,相当于mvc开发中的框架中的控制器
// 加载路由控制
var routes = require(‘./routes/index’);
var users = require(‘./routes/users’);
var hello = require(‘./routes/hello’);
var http=require(‘http’);
//用于处理目录的对象
var path = require(‘path’);
var favicon = require(‘serve-favicon’);
var logger = require(‘morgan’);
var cookieParser = require(‘cookie-parser’);
var bodyParser = require(‘body-parser’);
// 创建项目实例
var app = express();
/* 定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎*/
// view engine setup
// 设置views路径和模板
//__dirname是node.js里面的全局变量,即取得执行的js所在的路径,另外__dirname是目前执行的js文件名。所以,app.set(‘views’, __dirname + ‘/views’);是设置views的文件//夹。
app.set(‘views’, __dirname + ‘/views’)
//设置express.js所使用的render engine。除了Jade之外,express.js还支持EJS(embedded javascript)、Haml、CoffeScript和jQuery template等js模板
app.set(‘view engine’, ‘jade’);
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, ‘public’, ‘favicon.ico’)));
/是Connect內建的middleware,设置此处可以将client提交过来的post请求放入request.body中。/
/app.use 加载用于处理http請求的middleware(中间件),当一个请求来的时候,会依次被这些 middlewares处理。/
//express.bodyParser()是Connect內建的middleware,设置此处可以将client提交过来的post请求放入request.body中 并以json格式作为参数。
// 定义数据解析器
app.use(bodyParser.json());
// 定义日志和输出级别
app.use(logger(‘dev’));
// 定义icon图标
app.use(favicon(__dirname + ‘/public/favicon.ico’));
app.use(bodyParser.urlencoded({ extended: false }));
// 定义cookie解析器
app.use(cookieParser());
// 定义静态文件目录
app.use(express.static(path.join(__dirname, ‘public’)));
// 匹配路径和路由
app.use(‘/’, routes);
app.use(‘/users’, users);
app.use(‘/hello’,hello);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error(‘Not Found’);
// 404错误处理
err.status = 404;
next(err);
});

// error handlers
// development error handler
// will print stacktrace
// 开发环境,500错误处理和错误堆栈跟踪
if (app.get(‘env’) === ‘development’) {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render(‘error’, {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
// 生产环境,500错误处理
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render(‘error’, {
message: err.message,
error: {}
});
});

/*app.listen(3000,function(){

console.log(‘server start …’);
});*/
// 输出模型app
app.listen(3000,function(){

console.log(‘server start …’);
});
module.exports = app;

模板引擎

模板引擎:是一个从页面模板根据一定的规矩生成HTML的工具
模板引擎的功能是将页面模板和要显示的数据结合起来生成HTML页面,既可以被运行在服务器端又可以运行在客户端,大多数的时候都在服务器端被解析为html。之后再传给客户端


使用模板引擎
app.set(‘views’, __dirname + ‘/views’)
app.set(‘view engine’, ‘jade’);
表明要使用的模板引擎是jade,页面在view子目录下。
res.render(‘index’,{title:’Express’})
res.render()的功能就是调用模板引擎,并将产生的页面直接返回给客户端。接受两个参数,
1、模板的名称
2、传递给模板的数据

用户注册和登陆

1、访问数据库

node.js开发网站_第2张图片

2、MongoDB

它是一个对象数据库,没有表和行的概念,也没有固定的模式和结构,所有的数据以文档的形式存储。所谓的文档就是一个关联数组式的对象,内部由属性组成,一个属性可能是一个数、字符串、日期、数组、甚至是一个文档
node.js开发网站_第3张图片
这些格式看起来好像json,没错,MongoDB的数据格式就是json,在MongoDB中对数据的操作都是以文档为单位的,为了加快查询,MongoDB页对文档实现了索引

3、连接数据库

node.js开发网站_第4张图片
开启mongodb
D:\software\monogodb\mongodb\bin>mongod -config D:\software\monogodb\mongodb.config

4、会话的概念

会话是一种持久的网络协议,用于完成服务器和客户端之间的一些交互行为。会话是一个比连接粒度大的概念,一次会话可能有多次连接,每次连接都被认为是会话的一次操作。在网络应用开发中,有必要实现会话以帮助用户交互。例如网上购物的场景,用户浏览了多个页面,购买了一些物品,这些请求在多次连接中完成。许多应用层的协议都是由会话支持的,如ftp、Telent,而http协议是无状态的,本身不支持会话,在额外手段的支持下,
为了无状态的http协议之上实现会话,cookie诞生了。cookie是存储在客户端的信息,每次连接的时候由浏览器向服务器递交,服务器也向浏览器发起存储cookie的请求,依靠这样的手段卡哇伊识别客户端
node.js开发网站_第5张图片

你可能感兴趣的:(express)