博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js实践
阅读量:4350 次
发布时间:2019-06-07

本文共 4920 字,大约阅读时间需要 16 分钟。

最近看完了《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()废弃掉之后的解决方案:

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);};

转载于:https://www.cnblogs.com/puncha/archive/2012/12/11/3877020.html

你可能感兴趣的文章
[转载] Activiti Tenant Id 字段释疑
查看>>
[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
查看>>
SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能
查看>>
最小权限的挑战
查看>>
jquery 视觉特效(水平滚动图片)
查看>>
SVG笔记
查看>>
go web framework gin group api 设计
查看>>
linux下使用dd命令写入镜像文件到u盘
查看>>
001---进程
查看>>
视频人脸检测——OpenCV版(三)
查看>>
php获取来访者在搜索引擎搜索某个关键词,进入网站
查看>>
物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息
查看>>
2018-2019-1 20165234 20165236 实验二 固件程序设计
查看>>
IDEA的GUI连接数据库写入SQL语句的问题总结
查看>>
Xpath在选择器中正确,在代码中返回的是空列表问题
查看>>
leecode第一百九十八题(打家劫舍)
查看>>
【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
查看>>
07-3. 数素数 (20)
查看>>
写一个欢迎页node统计接口Py脚本(邮件,附件)-py
查看>>
计算两个日期之间的天数
查看>>