安装express框架
备注:这个需要root权限
npm install -g express-generator 全局安装express框架
express -V可查询express是否安装成功
express -h 选项可列出所有可用的命令行选项
express建项目
在你想要生成项目的文件夹中执行命令:
express myapp

然后cd进入新建项目的目录,安装所有依赖包(主要是根据package.json这个文件里面的包进行搜索安装)
cd myapp
npm install
安装的过程可能会比较缓慢,这个主要看网速了...不过我一下子就好了
然后cd进入项目中bin目录,启动项目
./www
如果在项目外可执行./bin/www
最后在浏览器中输入你当前服务器ip地址以及端口号3000,便可以访问...
express生成的应用目录结构
|-- app.js
|-- bin
| I__ www
|-- package.json
|-- public
| I__ images
| I__ javascripts
| I__ stylesheets
| I__style.css
I__ views
|-- index.jade
I-- error.jade
I-- layout.jade
目录详细介绍
目录结构
bin 存放启动项目的脚本文件
node_modules 项目所有依赖的库,以及存放
package.json中安装的模块,添加依赖的模块并安
装后,存放在这个文件夹下
public 静态文件(css,js,img)
routes 路由文件(mvc中cotroller)
views 页面文件(jade模板) 可以更换模板ejs
package.json 存储着工程的信息及模块依赖
app.js 应用核心配置文件(入口文件)

package.json用于项目依赖配置及开发者信
息,scripts属性时用于定义操作命令,可以非常方便
的添加启动命令,比如默认的start,用npm start代表
执行node ./bin/www命令.挡在dependencies中添
加依赖的模块时,运行npm install,npm会检查当前
目录下的package.json,并自动安装所有指定的模块
app.js 核心文件,也是项目入口文件
var express = require('express');
//用于处理目录的对象,提高开发效率
var path = require('path');
//用于加载图标
var favicon = require('serve-favicon');
/在控制台中,显示req请求的信息
var logger = require('morgan');
//加载cooike模块,用于获取web浏览器发送的cookie中的内容
var cookieParser = require('cookie-parser');
//解析客户端请求的body中的内容,内部使用json编码处理,url编码处理以及对于文件的上传处理
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
//生成一个express实例app
var app = express();
// view engine setup
//设置views文件夹,__dirname是node.js里面的全局变量,取得执行js所在的路径
app.set('views', path.join(__dirname, 'views'));
//视图引擎设置
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//定义icon图标,参数为图标的路劲,如果不指明,则用默认的express图标
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
//加载日志中间件,定义日志和输出级别
app.use(logger('dev'));
//加载解析json的中间件,接收json请求
app.use(bodyParser.json());
//加载解析urlencodeed请求体的中间件
app.use(bodyParser.urlencoded({ extended: false }));
//加载cookie的中间件
app.use(cookieParser());
//静态文件目录设置,设置public文件夹为存放静态文件的目录
app.use(express.static(path.join(__dirname, 'public')));
//路由控制器
app.use('/', routes);
app.use('/users', users);
//捕捉404错误,并转发到错误处理器
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
//开发环境下的500错误处理器,将错误信息渲染error模板并显示到浏览器中
// development error handler
// will print stacktrace
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
});
});
}
//生产环境下的错误处理器,将错误信息渲染error模板并显示到浏览器中
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
//导出app实例供其他模块调用
module.exports = app;
bin/www文件
www文件内容:这里拥有着http服务器基本配置,www文件也是一个node脚本,用于分离配置和启动程序时用,代码如下:
edwin@edwinxdf:~/express_demo/myapp/bin$ vim www
//表明是node可执行文件
#!/usr/bin/env node
/**
* Module dependencies.
*/
//引入上面导出的app实例
var app = require('../app');
//引入debug模块,打印调试日志
var debug = require('debug')('myapp:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
//定义启动端口
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
//端口标准化函数
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
//HTTP异常事件处理函数
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
//事件绑定函数
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
routes
生成一个路由实例用来捕获访问主页的get请求,导出这个路由并在app.js中通过app.use("/",routes);加载,这样当访问主页时,就会调用res.render("index",{'title':'Express'});渲染views/index.jade模板并显示到浏览器中
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
关于路由,路由中有两个常用功能:
app.route()函数,创建可连接的途径处理程序的路由路径
express.Router类,创建模块化安装路径的处理程序
app.Route方法会返回一个Route实例,它可以继续使用所有的HTTP方法,包括get,post,all,put,delete,head等
app.route('/users')
.get(function(req,res,next){})
.post(function(req,res,next){})
express.Router类,则可以帮助我们更好的组织代码结构,在app.js文件中,定义了app.use('/',routes);routes是指向了routes目录下的index.js文件,./routes/index.js文件中,express.Router被定义使用,路径/*处理都会由routes/index.js文件里的Router来处理,如果我们要管理不同的路口经,那么可以直接配置为多个不同的Router
1 app.use('/user', require('./routes/user').user);
2 app.use('/admin',require('./routes/admin').admin);
3 app.use('/', require('./routes'));
网友评论