Node.js实践
2012-12-11 21:46
603 查看
最近看完了《Node.js开发指南》一书,有两个比较惭愧的地方:1)这本书是一名清华大学大二的学生写的。2)我看的是电子书。。。这本书总体来说,还是不错的,一看就懂,绝对能帮你入门。知识点覆盖蛮全的。当然这不是一本“揭秘“类丛书,所以没有很深入的研究。当然,node.js也不需要深入,谁都不知道他能活多久。
当开始尝试实践里面的例子的时候,遇到了不小的麻烦,首先是express库已经从2.0升级到了3.0,很多api不能用了,很多组件也被独立出来了,在网上找了很久才找到替换方案。
同时,因为书里面没有讲解app.use()和app.set()是干什么用的,这个让我很不解。直到我上网看到了几篇express.js代码研究的博客,豁然开朗。app.use()就是往express.js/或者connect.js内部的stack里面放东西,比如用户请求网址"/xxx",按照入栈的顺序(所以那个应该是队列吧),express会挨个调用stack里面的函数(也可能是stack里面对象的函数)。有favicon的,有static路由的,有rounter的)。
现在也理解了网友给出的app.DynamicHelpers()废弃掉之后的解决方案:
加入一个路由,使得每个web请求时,都会在res.locals里面加入2个属性:user,keyword。当然这个use一定要在app.use(session)之后,app.use(router)之前调用。
好了,经过2周左右的学习,基本上node.js算入门了,入门对我来说也已经够了~~~接下来再玩些别的。下面贴一下我的部分代码(兼容express.js 3)
app.js:
index.js:
user.js:
mongoUtil.js:
当开始尝试实践里面的例子的时候,遇到了不小的麻烦,首先是express库已经从2.0升级到了3.0,很多api不能用了,很多组件也被独立出来了,在网上找了很久才找到替换方案。
同时,因为书里面没有讲解app.use()和app.set()是干什么用的,这个让我很不解。直到我上网看到了几篇express.js代码研究的博客,豁然开朗。app.use()就是往express.js/或者connect.js内部的stack里面放东西,比如用户请求网址"/xxx",按照入栈的顺序(所以那个应该是队列吧),express会挨个调用stack里面的函数(也可能是stack里面对象的函数)。有favicon的,有static路由的,有rounter的)。
现在也理解了网友给出的app.DynamicHelpers()废弃掉之后的解决方案:
app.use(function(req,res,next){ res.locals.user = req.session ? req.session.user:''; res.locals.keyword = req.session ? req.session.keyword:''; next(); });
加入一个路由,使得每个web请求时,都会在res.locals里面加入2个属性:user,keyword。当然这个use一定要在app.use(session)之后,app.use(router)之前调用。
好了,经过2周左右的学习,基本上node.js算入门了,入门对我来说也已经够了~~~接下来再玩些别的。下面贴一下我的部分代码(兼容express.js 3)
app.js:
/**
* Module dependencies.
*/
var express = require('express')
, partials = require('express-partials')
// , mongoUtil = require('./mongoUtil.js')
, MongoStore = require('connect-mongo')(express)
, settings = require('./settings.js')
, routes = require('./routes')
, http = require('http')
, path = require('path');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(partials());
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
secret: settings.cookieSecret,
store: new MongoStore({db: settings.db})
}));
app.use(function(req,res,next){ res.locals.user = req.session ? req.session.user:''; res.locals.keyword = req.session ? req.session.keyword:''; next(); });
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
routes(app);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
index.js:
var User = require("../user") module.exports = function(app) { app.get('/', function(req, res) { res.render('index', {title: '首页'}); }); app.get('/reg', function(req, res) { res.render('reg', {title: '用户注册'}); }); app.post('/reg', function(req, res){ // insert to mongo db var user = new User(req.body["username"], req.body["password"]); user.add(); res.render("/", {title: "恭喜注册成功"}) }); app.get('/login', function(req, res){ res.render("login", {title: "Login please..."}) }); app.post('/login', function(req, res){ // insert to mongo db var user = new User(req.body["username"], req.body["password"]); user.exists(function(exists){ if(exists) { req.session.user = user; res.redirect("/"); } else { req.session.user = null; res.redirect("/login"); } }); }); app.get('/login', function(req, res){ res.render('reg', {title: 'haha'}); }); };
user.js:
var MongoClient = require('mongodb').MongoClient; var mongoUtil = require('./mongoUtil') module.exports = User; function User(name, psw){ this.name = name; this.psw = psw; } User.prototype.users = []; User.prototype.add = function add() { var that = this; //User.prototype.users.push(this); // insert a record to mongo db MongoClient.connect(mongoUtil.getDbUrl(), function(err, db) { if(err) { return console.dir(err); } db.collection('users', function(err, items) { items.findOne({"name" : that.name}, function(err, item){ if (!item) items.insert({"name": that.name, "psw":that.psw}, {w:1}, function(err, result){}); }); }); }); } User.prototype.remove = function remove() { // remove current user } User.prototype.exists = function exists(callback) { var that = this; MongoClient.connect(mongoUtil.getDbUrl(), function(err, db) { if(err) { return false; } db.collection('users', function(err, items) { items.findOne({"name" : that.name}, function(err, item){ if (item) callback(true); else callback(false); }); }); }); }
mongoUtil.js:
exports.getDbUrl = function(){ if(process.env.VCAP_SERVICES){ var env = JSON.parse(process.env.VCAP_SERVICES); var mongo = env['mongodb-2.0'][0]['credentials']; } else{ var mongo = { "hostname":"localhost", "port":27017, "username":"", "password":"", "name":"", "db":"db" } } var generate_mongo_url = function(obj){ obj.hostname = (obj.hostname || 'localhost'); obj.port = (obj.port || 27017); obj.db = (obj.db || 'test'); if(obj.username && obj.password){ return "mongodb://" + obj.username + ":" + obj.password + "@" + obj.hostname + ":" + obj.port + "/" + obj.db; } else{ return "mongodb://" + obj.hostname + ":" + obj.port + "/" + obj.db; } } return generate_mongo_url(mongo); };
相关文章推荐
- 使用Node.js完成的第一个项目的实践总结
- nodejs socket.io 简单实践
- 开始nodejs+express的学习+实践(1)
- node.js下when.js(Promises/A)的实践
- (Pomelo系列入门教材)Node.js之网游服务器实践
- 《Node.js在CLI下的工程化体系实践》成都OSC源创会分享总结
- postgres+socket.io+nodejs实时地图应用实践
- Webstorm开发Node.js应用代码自动补全最佳实践
- node.js下LDAP查询实践
- Node.js编写CLI的实践
- Node.js之网游服务器实践
- nodejs + mySQL实践
- Node.js实践第一天
- [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题
- Node.js liveinjs-gbk 模块 实践总结(一):javascript 的位运算.
- Node.js编写CLI的实践
- Cookie和Session在Node.JS中的实践(一)
- Node.js之网游服务器实践
- Cookie和Session在Node.JS中的实践(二)
- mongDB+nodejs的实践