zoukankan      html  css  js  c++  java
  • Node.js实践

    最近看完了《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);
    };

  • 相关阅读:
    POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串
    SPOJ
    POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串
    POJ3261 Milk Patterns —— 后缀数组 出现k次且可重叠的最长子串
    POJ1743 Musical Theme —— 后缀数组 重复出现且不重叠的最长子串
    SPOJ
    AC自动机小结
    HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
    POJ1625 Censored! —— AC自动机 + DP + 大数
    Herding
  • 原文地址:https://www.cnblogs.com/puncha/p/3877020.html
Copyright © 2011-2022 走看看