ExpressJS for NodeJS 开发(草稿)
// 开始编写,所以比较凌乱,随笔写法,之后会逐步整理
作者:LEO.Zeng EMAIL: lelandtseng@gmail.com QQ:308212012
前言
ExpressJS是一个Web开发框架,基于NodeJS。我们没有必要对历史产生兴趣,我相信直入主题是你最喜欢的。
我们用ExpressJS就是要开发优秀的Web应用程序,而我们用的语言就是Javascript,而NodeJS就是运行
Javascript的容器环境。我们知道Javascript的宿主有浏览器,这一下又多了一个NodeJS,也就是我们可以
用JavaScript编写服务器端的程序了。
以上就简介这些,我想说的太多没有什么好处。前提你要熟悉Javascript语言。
安装NodeJS 参考 http://nodejs.org
安装ExpressJS 参考 http://github.com/visionmedia/express
安装好NodeJS之后可以在终端运行 node -v 测试结果应该是nodeJS的版本号,同理ExpressJS也可以用
express -v 查看其版本号。
下面以express例子作为基础,开始讲解Express用法,
源代码 http://github.com/visionmedia/express/tree/master/examples/mvc/
我们通过 node app.js 就可以启动这个 mvc 程序
我们先来看一下 app.js源代码:
//这一句是导入express库,require类似我们浏览器<script src...>的用法
var express = require('../../lib/express');
//通过express创建一个Express应用app.
var app = express.createServer();
//导入mvc库,并调用boot启动方法
require('./mvc').boot(app);
//启动服务器监听 request
app.listen();
//在控制台打印描述
console.log('Application server started on port 3000');
我们再来看一下 mvc.js的源代码
//fs是文件读写的库是nodejs的重要API
var fs = require('fs'),
express = require('../../lib/express');
***************************************************
exports英文是出口的意思,这是属于nodejs的一个核心属性。
app.js中能够这么写 require('./mvc').boot(app); 也是由于它。
这里不做太多叙述,因为会更迷糊,看看上面的引用例子就明白拉。
***************************************************
exports.boot = function(app){
bootApplication(app);
bootControllers(app);
};
// 启动APP
function bootApplication(app) {
***************************************************
app.use() 方法可以说是express核心。
我们知道web应用的原理,简化来说,就是 req -> app -> res 的过程。
而nodejs也是提供req和res的,但是都很原始,比如没有cookie/session
等功能。
通过app.use()就可以对req和res进行扩展
比如 app.use(express.session()); 我们就扩展了 req,使得它
具有 req.session 的属性。
***************************************************
app.use(express.logger({ format: ':method :url :status' }));
app.use(express.bodyDecoder());
app.use(express.methodOverride());
app.use(express.cookieDecoder());
app.use(express.session());
app.use(app.router);
app.use(express.staticProvider(__dirname + '/public'));
// 表示当路由是 “/” 时候返回404.html页
app.use(function(req, res){
res.render('404');
});
// 设置views页面主目录
app.set('views', __dirname + '/views');
// 设置动态页面的引擎采用ejs,并且扩展名为.html时,会自动用EJS引擎解析。
app.register('.html', require('ejs'));
app.set('view engine', 'html');
// 这是动态帮助,这里面可以定义views/里面的ejs页面访问的方法。
app.dynamicHelpers({
request: function(req){ //定义的方法
return req;
},
hasMessages: function(req){
return Object.keys(req.session.flash || {}).length;
},
messages: function(req){
return function(){
var msgs = req.flash();
return Object.keys(msgs).reduce(function(arr, type){
return arr.concat(msgs[type]);
}, []);
}
}
});
}
// 启动控制器
function bootControllers(app) {
fs.readdir(__dirname + '/controllers', function(err, files){
if (err) throw err;
files.forEach(function(file){
bootController(app, file);
});
});
}
function bootController(app, file) {
var name = file.replace('.js', ''),
actions = require('./controllers/' + name),
plural = name + 's', // realistically we would use an inflection lib
prefix = '/' + plural;
// Special case for "app"
if (name == 'app') {
prefix = '/';
}
Object.keys(actions).map(function(action){
var fn = controllerAction(name, plural, action, actions[action]);
switch(action) {
case 'index':
app.get(prefix, fn);
break;
case 'show':
app.get(prefix + '/:id', fn);
break;
case 'add':
app.get(prefix + '/:id/add', fn);
break;
case 'create':
app.post(prefix + '/:id', fn);
break;
case 'edit':
app.get(prefix + '/:id/edit', fn);
break;
case 'update':
app.put(prefix + '/:id', fn);
break;
case 'destroy':
app.del(prefix + '/:id', fn);
break;
}
});
}
function controllerAction(name, plural, action, fn) {
return function(req, res, next){
var render = res.render,
path = __dirname + '/views/' + name + '/' + action + '.html';
res.render = function(obj, options, fn){
res.render = render;
options = options || {};
options.locals = options.locals || {};
// Expose obj as the "users" or "user" local
if (action == 'index') {
options.locals[plural] = obj;
} else {
options.locals[name] = obj;
}
return res.render(path, options, fn);
};
fn.apply(this, arguments);
};
}
ExpressJS for NodeJS 开发(草稿)
最新推荐文章于 2024-09-24 11:55:49 发布