Ubuntu下部署nodejs+mongodb

捣鼓阿里云上的VPS,入门Linux,记录一下部署 NodeJs+MongoDB 的过程

  1. Ubuntu下安装NodeJS

    在 Ubuntu 12.04 ~ 13.04 中,默认安装的的 Node 版本是 0.6.x的

     $ sudo apt-get install nodejs
     $ sudo apt-get install npm
     $ node -v
    

    而在 Ubuntu 13.10 ~ 14.04 中则是 0.10.x 版本

    我的版本是旧版,所以需要使用这种方式来安装:

     $ sudo apt-get install software-properties-common
     $ sudo apt-get install python-software-properties
     // 安装以上两个包后才会有下面这个 add-apt-repository 命令:
     $ sudo add-apt-repository ppa:chris-lea/node.js
     $ sudo apt-get update
     $ sudo apt-get install python-software-properties python g++ make nodejs
    
  1. Linux下安装MongoDB

阅读全文

前端工具收集

  1. 1. CSS 类
  2. 2. 工具类

这里整理一些我自己用过且觉得好用的工具、类库的玩意~

欢迎推荐更多好玩的给我:)

CSS 类

  • fontAwesome 海量可伸缩的字体图标

示例:

    <link href="//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">
    <!-- 显示不同尺寸的照相机(camera)图标 -->
    <i class="fa fa-camera-retro fa-lg"></i> fa-lg
    <i class="fa fa-camera-retro fa-2x"></i> fa-2x
    <i class="fa fa-camera-retro fa-3x"></i> fa-3x
    <i class="fa fa-camera-retro fa-4x"></i> fa-4x
    <i class="fa fa-camera-retro fa-5x"></i> fa-5x

链接:

  1. http://fontawesome.io/
  2. Github

工具类

  • component 快速安装第三方类库

示例:

1. 安装 component

    $ npm install -g component

2. 创建配置文件 component.json

    {
      "name": "getting-started-with-component",
      "dependencies": {
        "necolas/normalize.css": "^3.0.0"  // 依赖normalize.css类库
      },
      "scripts": ["index.js"],    // 引入自定义的js
      "styles": ["index.css"]    // 引入自定义的css
    }

2. 创建 index.html

    // index.html 注意这里只有 build/build.css 和 build/build.js 文件
    <!DOCTYPE html>
    <html>
      <head>
        <title>Getting Started with Component</title>
        <link rel="stylesheet" href="build/build.css">
      </head>
      <body>
        <h1>Getting Started with Component</h1>
        <p class="blink">Woo!</p>
        <script src="build/build.js"></script>
      </body>
    </html>    

3. 创建 index.css
    * {
          box-sizing: border-box;
    }

4. 创建 index.js

    console.log('Hello component!')

5. 使用 build 命令进行构建

    $ component build

6. 打开 index.html 看看吧:)

链接:

  1. http://component.io/
  2. Guide

编写爬虫会使用到的一些模块

  • request 模块

    用于简化HTTP请求

  • cheerio 模块

    jquery core 的子集,实现了与DOM操作无关的API

  • async 模块

    用于简化异步代码的编写

  • debug 模块

    用于显示调试信息

  • cron 模块

    用于定时执行任务

  • child_process API

    用于启动新的进程

  • pm2 模块

    用于自动重启程序

  • uncaughException 处理错误

    process.on(‘uncaughtException’, function (err) {

      console.error('uncaughtException: ', err.stack);
    

    })

阅读全文

Mongoose-学习笔记

定义模式 Schema -> 定义模型 model -> 定义实例 -> 增查删改这个实例

在模式中可以直接定义一些方法,使得使用模型生成的实例都继承了这些方法,可直接调用。

  • 快速开始

      var mongoose = require('mongoose');
    
      // 【模式】
      var UserSchema = mongoose.Schema({
        name: String,
        age: Number
      })
    
      // 【方法】在模式中添加一个方法,则生成的实例中将可以直接调用这个方法
      UserSchema.methods.say = function () {
        var name = this.name;
        if (name) {
          console.log('我的名字是:', name);
        } else {
          console.log('我还没有名字');
        }
      };
    
      // 【模型】使用模式定义一个模型
      var User = mongoose.model('User', UserSchema);
    
      // 【实例】使用模型定义一个实例
      var newUser = new User({
        name: '小赖',
        age: 18  // 我年年十八
      })
      // 【实例】使用模型定义一个实例
      var r = parseInt(Math.random() * 10 + 20);
      var newUserRandom = new User({
        name: '用户'+r,
        age: r  //
      })
      // 实例中调用模式中定义好的方法
      newUser.say(); // => '我的名字是:小赖'
      newUserRandom.say();
    
      // 【增】将实例保存到数据库
      newUser.save(function (err, newUser) {
        if (err) throw err;
        console.log('【增】保存数据成功, 成功保存的数据是:\n', newUser);
      });
      // 【增】将实例保存到数据库
      newUserRandom.save(function (err, newUser) {
        if (err) throw err;
        console.log('【增】保存数据成功, 成功保存的数据是:\n', newUserRandom);
      });
    
      // 【查】查询所有文档
      User.find(function (err, users) {
        if (err) throw err;
        console.log('【查】当前数据库的所有用户是:\n', users);
      });
      // 【查】限定条件查询
      User.find({age: 20}, function (err, users) {
        if (err) throw err;
        console.log('查询到年龄为20的用户有:\n', users);
      })
    
      // 连接数据库
      mongoose.connect('mongodb://localhost/test');
    
      // 获取连接
      var db = mongoose.connection;
    
      // 连接错误
      db.on('error', function (err) {
        console.log('连接失败:', err);
      });
    
      // 连接成功
      db.on('open', function () {
        console.log('连接成功!');
      })
    

阅读全文

learnyounode 练习

learnyounode 是 nodeschool.io 出品的nodejs入门练习项目

通过这个练习算是对nodejs有了个入门的认识吧,边学边敲边写笔记

  • 2.输入任意数字求和.js

    // 输入任意个数字,输出这任意个数字的和
    // process.argv 变量保存了输入的参数,注意第一个永远为'node',第二个是执行路径'path/to/my/file',第三个开始才是我们真正传入的参数
    // 传入的参数当做字符串了,注意类型转换,如下面Number() 将数字字符转换为数字再进行计算
    
    var len = process.argv.length;
    // slice(2) 截取数组
    var numbers = process.argv.slice(2);
    var sum = 0;
    for (var i = numbers.length - 1; i >= 0; i--) {
          sum += Number(numbers[i]);
    };
    console.log(sum);
    

阅读全文

express提供的中间件

Express 框架中常用的一些中间件的使用方法

  • basiAuth 访问控制

      // 帐号密码正确时才发回 true,才能继续访问
      var express =  require('express');
      var app = express();
      // 这里的用户名和密码应从数据库读取
      app.use(express.basicAuth('username', 'password'));
      app.get('/', function (req, res) {
          res. send('成功登录后才会看到这段内容。');
      });
      app.listen(1234, 'localhost');
    
  • bodyParse 处理请求 body 的内容

      // 内部使用 JSON    编码、url 编码处理和文件的上传处理
      // 处理一个上传文件
      <body>
        <h1>使用 express.bodyParser 中间件上传文件</h1>
        <form id="myForm" action="upload.html" method="post" enctype="multipart/form-data">
          <input type="file" id="file" name="file">
          <input type="submit" onclick="uploadFile()" value="上传">
        </form>
        <div id="result">
          选择文件后,点击按钮上传.
        </div>
      </body>
    
    // 帐号密码正确时才发回 true,才能继续访问
    var express =  require('express');
    var connect = require('connect');
    var fs = require('fs');
        var app = express();
    // 使用 bodyParser 处理上传
    // app.use(express.bodyParser());
    app.use(connect.urlencoded());
    app.use(connect.json());
    app.get('/upload.html', function (req, res) {
      res.sendFile(__dirname + '/upload.html');
    });
    // 开始处理
    app.post('/upload.html', function (req, res) {
      var file = req.files.myFile;
      // 读取文件
      fs.readFile(file.path, function (err, data) {
        if (err) throw err; //读取文件失败
        fs.writeFile(file.name, data, function (err) {
          if (err) throw err; // 写入文件失败
          res.send('文件上传成功!');
        })
      })
    })
    app.listen(1234, 'localhost');
  • compress 压缩响应流数据

      // 在其他中间前调用才能保证全部数据流都压缩
    
  • cookieParser 处理 cookie

      var express = require('express');
      var app = express();
      // 使用 cookieParser 处理 cookie
      app.use(express.cookieParser());
      // 提前在 cookie.html 中埋下 cookie
      app.get('/cookie.html', function (req, res) {
          res.sendFile(__dirname + '/cookie.html');
      });
      app.post('/cookie.html', function (req, res) {
        var cookies = req.cookies;
        // 开始处理
        for (var key in cookies) {
          res.write('名:', key);
          res.write('值:', cookies[key]);
          res.write('</br>');
        }
        res.end();
      });
      app.listen(1234, 'localhost');        
    
  • csrf 防止跨站访问

      // 与 session 中间件 和 bodyParser 中间件配合使用
    
  • directory 列出某目录下的文件列表

      // app.use(express.directory(path, [options]))
      // 与 express.static 配合使用
      app.use(express.static(__dirname));
      app.use(express.directory(__dirname), {icons: true}); // 显示文件icon
      // 此时会列出文件目录,且点击静态文件(如js/css)可直接访问
    
  • errorHandler 捕获错误

  • limit 限制请求提交数据的字节数

      // 限制为 1M,超出则报错
      var size = 1024*1024; // 1M
      app.use(express.limit(size))
    
  • logger 输出日志到文件中

      // app.use(express.logger([options]))
      // options = {
      //    immediate: false, // 是否在接收到客户端请求时就输出日志,否则服务器端发送完响应数据才输出
      //    format: 'default', // 可选 default/short/tiny/dev,即输出日志的格式        //  stream: process.stdout, // 指定输出数据流的对象
      //     buffer: undefined, // 整数毫秒则指定缓存区有效时间啊暖,或为 true 时,使用缓存区且有效时间为 1000ms
      // }
      var express = require('express');
      var app = express();
      app.use(express.logger({
          format: 'default',
          stream: process.stdout
      }))
    
  • methodOverride 为 bodyParser 提供 HTTP 支持

  • reponseTime 在响应头添加 X-Request-Time 字段

      // 使用后可在 浏览器控制台查看到响应头多了一个 X-Request-Time 
      app.use(express.responseTime());
    
  • router 提供路由功能

      // express 3.x 隐式使用了 router 
    
  • session 提供session功能

      // session 加密过的数据保存在 cookie 中
      app.use(express.session([options]))
      options = {
          key: connect.sid, // 字符串,指定保存这个 session 的 cookie 名
          store: , // 保存 session 的第三方存储对象
          fingerprint: function () {}, // 一个自定义指纹生成函数
          cookie: {path: '/', httpOnly: true, maxAge: 14400000}, // 指定保存 session 的设置 cookie 的对象
          secret: 'xiaolai', // 字符串,用于 session 的数据加密(加盐)
      }
    
      // 使用这个中间件后,就有了 req.session 属性
      var express = require('express');
      var app = express();
      app.use(express.cookieParser());
      app.use(express.session({secret: 'xiaolai'}));
      app.get('/', function (req, res) {
          res.sendFile(__dianema + '/index.html');
          // 开始设置
          req.session.username = 'xiaolai';
          req.session.password = 'password';
    
          // 重新生成
          // req.session.regenerate(function (err) {});
    
          // 销毁
          // req.session.destroy(function (err) {});
      })
    
  • static 设置访问静态文件的功能

      // public 为存放静态文件的目录
      app.use(express.static('public'))
    
  • 自定义错误处理中间件

      app.use(function (err, req, res, next) {
          // 输出错误到服务端
          console.log(err.stack);
          next();
      })    
      app.use(function (err, req, res, next) {
          // 输出错误到客户端
          res.send(500, err.message);
      })    
    

阅读全文

MongoDB-学习笔记

MongoDB 支持的几钟数据类型

  • String

      // 字符串
      var mySite = 'laispace.com';            
    
  • Array

      // 数组
      var myFriends = ['小赖', '小清', '大花', '大黄'];
    
  • Boolean

      // 布尔类型,truefalse         
      var IloveU = true;
    
  • Code

      // 代码,可在数据库内运行
      var myCode = new BSON.Code('function (name) {
          return 'My name is ' + name;
      }');
    
  • Date

      // 日期
      var myDate = new Date();
    
  • Integer

      // 整数
      var myAge = 18; // 让我年轻一次嘛~
    
  • Long

      // 长整数
      var myMoney = new BSON.Long('999999999999999999999');
    
  • Hash

      // 数据字典
      var myInfo = {
          name: '小赖',
          age: '18,
          sex: 'male'
      };
    
  • Null

      // null 值
      var myBadFriend = null;
    
  • ObjectId

      // 索引ID,12字节,24位16进制串,用于唯一标识
      var myId = new BSON.ObjectId()
    
  • DBRef

      // 数据库引用
      var bestFriendId = new BSON.DBRef('users', friendObjectId);
    

阅读全文

NODEJS-常用模块

dns模块 解析域名

  • dns.resolve() 将一个域名解析为一组DNS记录

  • dns.reverse() 将一个IP地址饥饿虚伪一组域名

  • dns.lookup() 将一个域名转换为一个IP地址

      // rrtype即记录类型,默认为A,可选 A/AAAA/CNAME/MX/TXT/SRV/PTR/NS
      // A 将IPV4地址映射为域名
      // AAAA 将IPV6地址映射为域名
      // CNAME 别名解析,如 laispace.com 是 www.laispace.com 的别名
      // MX 邮件服务器解析
      // dns.resolve(domain, [rrtype], callback)
      var dns = require('dns');
      var domain = 'www.laispace.com';
      dns.resolve(domain, 'A', function (err, addresses) {
          if (err) {
              throw err;
          }
          console.log('域名解析结果为:\n', addresses);
      })
    

阅读全文

使用net模块创建TCP服务器

  • 创建TCP服务器

      var server = net.createServer([options], [connectionListener])
      // 相当于: 
      // var server = net.createServer([options]);
      // server.on('connection', connectionListener);
    

    方法1:

      // 监听端口
      // port 若为0则分配随机端口号
      // host 缺省则监听来自任何ipv4地址的客户端连接
      // backlog 默认为511,设定等待队列中最大的连接数,超过则拒绝
      server.listen(port, [host], [backlog], [callback])
    

    方法2:

      // 监听指定路径
      server.listen(path, [callback])
    

    方法3:

      // 监听socket句柄
      server.listen(handle, [callback])
    

    以上三种方法的 callback 可改写为:

      server.on('listening', function () {
          // callback code here
      })    
    

阅读全文