var express = require('express'), app = express.createServer(), hogan = require('express-hogan.js'), mongoose = require('mongoose'), Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/aaaaa'); /* require()是node.js提供的函数,可以让你引入其他模块以调用模块的函数和变量,默认下node.js会在$NODE_PATH和目前js所在目录下的node_modules文件夹下去寻找模块。require也可以用来载入自己写的模块哦~这样涉及到node.js的模块机制,后面有机会就在介绍。 第二行的express.createServer()就是在建立server,而中间的module.exports也是涉及到node.js的模块机制,以后再说。 */ app.configure(function() { app.set('views', __dirname + '/views'); app.set('view engine', 'html'); /* 上面两行是设置views文件夹,即模板文件夹,__dirname是node.js里面的全局变量,即取得执行的js所在的路径, 另外__filename是目前执行的js文件名。所以,app.set(‘views’, __dirname + ‘/views’);是设置views的文件夹。 而app.set('view engine', 'jade');是设置express.js所使用的render engine。除了Jade之外, express.js还支持EJS(embedded javascript)、Haml、CoffeScript和jQuery template等js模板。 */ app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); /* express.bodyParser()是Connect內建的middleware,设置此处可以将client提交过来的post请求放入request.body中。 express.methodOverride()也是Connect內建的,可以协助处理POST请求伪装PUT、DELETE和其他HTTP methods。 app.router()是route requests,但express.js的官方文件是这句可有可无,并且经过测试还真的是这样,不过还是写上吧。 express.static()也是一个Connect內建的middleware来处理静态的requests,例如css、js、img文件等。所以static()里面指定的文件夹中的文件会直接作为静态资源吐出来。 */ app.register('.html', hogan);//注册模板 app.set('view options', { layout: false }); }); app.configure('production', function(){ //console.log('in configure with production'); var oneYear = 31557600000; app.use(express.static(__dirname + '/static', { maxAge: oneYear })); app.use(express.errorHandler()); }); app.configure('development', function(){ //console.log('in configure with development'); app.use(express.static(__dirname + '/static')); //console.log(__dirname + '/static'); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.get('/', function(req, res) { res.render('index.html',{locals:{a:"页面标题被模板替换了"}}); }); /* 当访问默认域名时跳转到index.html试图,注意后面后面参数的格式 */ app.get('/user/:id?', function(req, res, next){ var id = req.params.id; if (id) { Member.find({UserName:id},function(err,docs){ if(docs.length==0) { console.log("No Data!"); }else { res.send(docs[0].UserName+"<br/>"+docs[0].Password); } }) } else { next(); // 将控制转向下一个符合URL的路由 } }); app.get('/user', function(req, res){ Member.find(function(err,docs){ if(docs.length!=0) { var msg=[]; docs.forEach(function(m) { msg.push("<a href='User/"+m.UserName+"'>"+m.UserName+"</a>|"+m.Password+"|<a href='edit/"+m.UserName+"'>Eidt</a>|<a href='del/"+m.UserName+"'>Del</a>|<a href='http://localhost:3000'>Add</a><br/>"); }); res.send(msg.join("")); } else { res.send("No Data!"); } }) }); app.get('/edit/:id', function(req, res){ var id = req.params.id; Member.findOne({UserName:id},function(err,item){ if(err) { res.send("HasError"); }else { res.render('edit.html',{locals:{UserName:item.UserName,Password:item.Password}}); } }) }); app.post('/edit/:id', function(req, res){ var id = req.params.id; var username=req.body.username; var password=req.body.password; Member.findOne({UserName:id},function(err,item){ if(err) { res.send("HasError"); }else { Member.update({UserName:id},{UserName:username,Password:password},function(err,num){ console.log(num); }); res.redirect("/user"); } }) }); app.get('/del/:id', function(req, res){ var id = req.params.id; Member.findOne({UserName:id},function(err,item){ if(err) { res.send("HasError"); }else { item.remove(); res.send("HasDel"); } }) }); /* 页面的路由处理,上例中当我们访问/user/12时返回“user 12”, csser注:app.get相当于在服务器注册了一个监听get请求事件的侦听器, 当请求的URL满足第一个参数时,执行后面的回调函数,该过程是异步的。 路由是一个可以被内部编译成正则表达式的简单字符串,比如当/user/:id被编译后,被内部编译后的正则表达式字符串看起来会是下面的样子(简化后): \/user\/([^\/]+)\/?,这里的'\'是转义用的 */ app.post('/', function(req, res){ console.log(req.body.username); console.log(req.body.password); try{ var member=new Member({ UserName:req.body.username,Password:req.body.password}) member.save(); res.redirect("/user"); } catch(except) { throw except; } }); var MemberSchema =new Schema({ UserName: String, Password: String }) var Member = mongoose.model('Member', MemberSchema); function StudentBuyBook(res) { throw new Error; res.send("asdasd"); } app.get('/500', function(req, res){ throw new Error('keyboard cat!'); }); app.get('/Error1',function(req,res){ res.send("Error Be Cacth") }); app.listen(3000); console.log( "Express server listening on port %d in %s mode", app.address().port, app.settings.env);