工程的结构文件

Express新建的microblog项目结构

1.app.js:项目入口及程序启动文件。 引入模块依赖, 模板引擎, 数据库引用等入口文件

2.package.json:存储着工程的信息及模块依赖,当在 dependencies 中添加依赖的模块时

3.node_modules:用来存放项目的依赖库, 存放安装的模块,当你在 package.json 添加依赖的模块并安装后,存放在这个文件夹下

4.public:存放用来存放静态文件( image、css、js)等文件 

5.routes:路由控制器。

6.views:存放视图文件或者说模版文件 (MVC中的V), 相当于HTML页面

7.bin:项目的启动文件,存放可执行文件 

8.models:数据模型(相当于MVC中的M)。

app.js 的配置说明

/*
* @模块依赖
*/
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');// 第三方中间件解析cookie, 可以在应用级加载, 也可以在路由级加载
var bodyParser = require('body-parser');
var partials = require('express-partials');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var settings = require('./settings'); 
var flash = require('connect-flash');
/*设置路由*/
var index = require('./routes/index');
var users = require('./routes/users');

var app = express();


/*
* @view engine setup 视图引擎设置
* @views 放模板文件的目录
* @view engine 模板引擎
*/
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(partials());

/*
* @加载环境变量
*/
// uncomment after placing your favicon in /public
// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
// express.static 是express唯一内置的中间件, 基于serve-static, 负责在Express应用中提托管静态资源,每个应用可有多个静态目录
app.use(express.static(path.join(__dirname, 'public')));
app.use(flash());
// 数据库引用
app.use(session({
    secret: settings.cookieSecret,
    store: new MongoStore({
        // db: settings.db,
        url: 'mongodb://localhost/microblog',
        autoRemove: 'native'
    })
}));

app.use(function(req, res, next){
    // console.log("app.usr local");
    res.locals.user = req.session.user;
    res.locals.post = req.session.post;
    var error = req.flash('error');
    res.locals.error = error.length ? error : null;

    var success = req.flash('success');
    res.locals.success = success.length ? success : null;
    next();
});

/*
* @加载路由
*/
app.use('/', index);
app.use('/users', users);

/*
* @错误处理解决办法
*/
// catch 404 and forward to error handler
// 这是一个没有挂载路径的"常规404中间件", 应用的每个请求都会执行该中间件
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
// 这是一个没有挂载路径的"错误处理中间件", 应用的每个请求都会执行该中间件
/*
* 必须使用4个参数, 即使不需要next对象, 也必须声明它, 否则中间件会被识别为一个常规则中间件, 不能处理错误
*/
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

/*
* @导出app对象
*/
module.exports = app;

1.require() 用于在当前模块中加载和使用其他模块;此方法是模块的基础,使用中大概有路径的概念就行。PS:JS文件可以去掉".js"后缀

var express = require('express');

// js文件可以去除后缀.js
var index = require('./routes/index');

2.express() 表示创建express应用程序

var app = express();

3.app.set(key, value) 是 Express 的参数设置工具,接受一个键(key)和一个值(value),可用的参数如下所示。

  • views              :视图文件的目录,存放模板文件。
  • view engine    :视图模板引擎。
  • view options   :全局视图参数对象。
  • view cache     :启用视图缓存。
  • basepath        :基础地址,通常用于 res.redirect() 跳转。
  • strict routing  :严格路径,启用后不会忽略路径末尾的“/ ”。
  • jsonp callback:开启透明的 JSONP 支持。
  • case sensitive routes:路径区分大小写。
/*
* @view engine setup 视图引擎设置
* @views 放模板文件的目录
* @view engine 模板引擎
*/
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

4.app.use(path,callback) 加载执行, 使用中间件 function,可选参数path默认为"/"。使用 app.use() “定义的”中间件的顺序非常重要,它们将会顺序执行,use的先后顺序决定了中间件的优先级(经常有搞错顺序的时候);

/*
* @加载路由
*/
app.use('/', index);
app.use('/users', users);

// 数据库引用
app.use(session({
    secret: settings.cookieSecret,
    store: new MongoStore({
        // db: settings.db,
        url: 'mongodb://localhost/microblog',
        autoRemove: 'native'
    })
}));

5.app.render(view, [options], callback) 渲染 view, callback 用来处理返回的渲染后的字符串。

// 首页
router.get("/",function(req,res) {
    res.render("reg",{
        title : "首页"
    });
});

6.app.listen() 给定的主机和端口上监听请求

app.listen('8808');

7.next函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么请求将被挂起,后边定义的中间件将得不到被执行的机会。

/*
* @错误处理解决办法
*/
// catch 404 and forward to error handler
// 这是一个没有挂载路径的"常规404中间件", 应用的每个请求都会执行该中间件
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});
原文地址:https://www.cnblogs.com/alantao/p/7998182.html