Express是Nodejs标准的web开发框架
参考http://blog.fens.me/nodejs-express4/
先安装 npminstall -g express
再安装npm install -gexpress-generator #全局安装-g
检查安装结果 express -V# 检查express的版本
卸载(需要时使用)
npm uninstall-g express
参考
http://blog.csdn.net/JBBOY/article/details/25038299
http://jingyan.baidu.com/album/922554468a3466851648f419.html?picindex=1
express -enodejs-demo
进入项目目录,下载依赖库,构建项目。
cd nodejs-demo && npm install
npm start
效果如下图
nodejs-demo/
├──app.js 应用核心配置文件
├──bin 启动项目的脚本文件
├──node_modules 项目依赖库
├──package.json 项目依赖配置及开发者信息
├──public 静态文件(css,js,img)
├──routes 路由文件(MVC中的C,controller)
└──views 页面文件(Ejs模板)
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
其中scripts属性是用于定义操作命令的,可以非常方便的增加启动命令,比如默认的start,用npm start代表执行node ./bin/www命令。
//加载依赖库,原来这个类库都封装在connect中,现在需地注单独加载 varexpress = require('express'); varpath = require('path'); varfavicon = require('serve-favicon'); varlogger = require('morgan'); varcookieParser = require('cookie-parser'); varbodyParser = require('body-parser'); //加载路由控制 varroutes = require('./routes/index'); //varusers = require('./routes/users'); //创建项目实例 varapp = express(); //定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎 app.set('views',path.join(__dirname, 'views')); app.set('viewengine', 'ejs'); //定义icon图标 app.use(favicon(__dirname+ '/public/favicon.ico')); //定义日志和输出级别 app.use(logger('dev')); //定义数据解析器 app.use(bodyParser.json()); 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); //404错误处理 app.use(function(req,res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); //开发环境,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 }); }); } //生产环境,500错误处理 app.use(function(err,req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); //输出模型app module.exports= app;
www文件也是一个node的脚本,用于分离配置和启动程序。
查看./bin/www文件。
#!/usr/bin/envnode /** * 依赖加载 */ varapp = require('../app'); vardebug = require('debug')('nodejs-demo:server'); varhttp = require('http'); /** * 定义启动端口 */ varport = normalizePort(process.env.PORT || '3000'); app.set('port',port); /** * 创建HTTP服务器实例 */ varserver = http.createServer(app); /** * 启动网络服务监听端口 */ server.listen(port); server.on('error',onError); server.on('listening',onListening); /** * 端口标准化函数 */ functionnormalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { return val; } if (port >= 0) { return port; } return false; } /** * HTTP异常事件处理函数 */ functiononError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port // handle specific listen errors withfriendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevatedprivileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already inuse'); process.exit(1); break; default: throw error; } } /** * 事件绑定函数 */ functiononListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); }
参考
http://blog.fens.me/nodejs-express4/