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

  • 相关阅读:
    [转载] 常用CASE工具介绍
    GridView, DataGrid 中,DataFormatString语法汇总
    [轉]SQL Server中数据类型详解
    强烈推荐asp.net数据访问的官方指南系列 (Data Access Tutorials)
    实现iFrame自适应高度,原来很简单!
    [转]Web service到底是什么?在什么情况下,你应该使用web service
    贴一个查询SQL Server数据库中所有表及其描述(Description)的SQL语句
    C#中,String和string的区别
    ERWin 连接SQL Sever2005的问题
    [转载]ERwin相关概念入门
  • 原文地址:https://www.cnblogs.com/puncha/p/3877020.html
Copyright © 2011-2022 走看看