nodejs学习笔记


nodejs是基于chromeV8引擎开发的

.模块

1.每个模块文件夹中,推荐都写一个package.json文件,这个文件的名字不能改.node将自动读取里面的配置.
  有一个main,就是入口文件.

2.node_modules文件夹下边的文件可以默认读取.

3.var foo = require("./test/foo.js");引入一个js文件.

4.var foo = require("bar");引入node_modules文件夹下的bar文件夹,不带扩展名,说明引入的事一个文件夹.

.npm  (http://www.npmjs.com)

  我们刚才学习了,模块就是一些功能的封装,所以一些成熟的,经常使用的功能,都有人封装成模块.并且放在社区中,供人免费下载.
  这个伟大的社区,叫做npm.也是一个工具名字,node package management.

1.npm的主要职责是安装开发包和管理依赖项.
  安装开发包,使用npm install命令;更新,使用npm update命令.
  管理依赖项,借助package.json文件.

2.npm install silly-datetime  安装silly-datetime , 默认安装到node_modules文件夹下.

3.require()中的路径,是从当前这个js文件出发,找到别人.
  fs模块读取文件的时候,用绝对路径,_dirname得到当前目录.

4.安装 Node 模块时,如果指定了 --save 参数,那么此模块将被添加到 package.json 文件中 dependencies 依赖列表中。
  然后通过 npm install 命令即可自动安装依赖列表中所列出的所有模块。

5.初始化package.json 文件  npm init

.ejs(后台)模板引擎

1.//引入模块
  var ejs = require("ejs");

  //模板
  var string  = "好高兴,今天我买了iPhone<%= a %>s";
  //数据
  var data = {
   a : 6 ,
  };
  //数据绑定
  var html = ejs.render(string,data);

  注意:underscore.js库的模板标记和ejs模板引擎的模板标记一样,在一起使用的时候会引起模板冲突
  解决办法:修改underscore的模板标记{{  }}

       <script type="text/template" id="moban">
          <div class="list-group">
              <a href="javascript:;" class="list-group-item active">
                  <h4 class="list-group-item-heading"><%= xingming%></h4>
                  <p class="list-group-item-text"><%= liuyan%></p>
              </a>
          </div>
       </script>

       <script type="text/javascript">
           //Ajax读取留言列表
           $.get("duly", function (result) {
               var json = JSON.parse(result);
               var compiled = _.template($("#moban").html());
               for(var i = 0; i < json.result.length ; i++){
                   var html = compiled({"xingming":json.result[i].xingming ,"liuyan":json.result[i].liuyan});
                   $("#liuyanList").append($(html));
               }
           })

       </script>

2.jade模板引擎(自己了解)


.express 4.x 框架(http://www.expressjs.com.cn/4x/api.html)

1.Web 应用

  Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。
  性能
  Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能。

2.app.use(express.static("./public"));express中静态文件处理,比原生nodejs简单很多,只需要这样一句话.

3.express与模板引擎配合,直观清晰.

  <ul>
      <% for(var i=0; i<news.length; i++){%>
      <li><%= news[i]%></li>
      <% } %>
  </ul>

  //设置模板引擎,直接去Node_module文件夹中找ejs模块.
  app.set("view engine","ejs");
  app.get("/",function(req,res){
      //"haha"等价于"./views/haha.ejs",  render(模板,数据)去渲染页面.
      res.render("haha",{
          news:["我是模板引擎","我很好","哈哈哈"],
      });
  });

4.路由

  //当访问网址的时候,能做什么:
  app.get(网址,function(req,res){

  });
  app.post(网址,function(req,res){

  });

  //如果想处理这个网址的任何method的请求,all();这里的网址不分大小写
  //所有的GET参数(?号后面的内容就是参数),都已经被忽略,锚点#也被忽略
  app.all(网址,function(req,res){

  });

5.中间件

  路由get,post这些东西,就是中间件,中间件讲究顺序,匹配上第一个之后,就不会往后匹配了,next函数才能继续匹配.
  app.use()也是一个中间件.getpost不同的是.他的网址不是精确匹配的,而是能够有小文件夹扩展的.

6.get请求和post请求的参数

  get请求的参数在URL,在原生node,需要使用URL模块来识别参数字符串.express,不需要使用url模块了.可以直接使用req.query对象得到;
  app.get('/admin', function (req,res) {
      //req.query得到的是请求的参数
      console.log(req.query);
  });

  post请求在express中不能直接获得,必须使用body-parser模块.使用后,将可以用req.body得到参数.
  但是如果表单中含有文件上传,那么还需要使用formidable模块.
  app.use(bodyParser.urlencoded({ extended: false }));
  app.post('/',function (req, res) {
      console.log(JSON.stringify(req.body));
  });


  Itcsat相比,
  Itcsat2是前后端分离,前端页面静态化


 7.express中的cookiesession(需要引入cookie-parser模块)




.underscore是一个js.在项目中用它是呈现模板的,让前后端实现分离,静态化前端模板

  <body>
    <div class="container">

    </div>

    //这个就是模板的内容
    <script type="text/template" id="newsList">
        <div class="jumbotron">
            <h1><%= biaoti%></h1>
            <p>时间:<%= shijian%> 作者:<%= zuozhe%></p>
            <p><%=jianjie%></p>
            <p><a class="btn btn-primary btn-lg" href="/news/<%= id%>" role="button">Learn more</a></p>
        </div>
    </script>

    <script src="js/jquery-1.9.1.min.js"></script>
    <script src="js/underscore-min.js"></script>

    <script type="text/javascript">
        //得到模板内容
        var mobanstring = $("#newsList").html();

        //模板函数
        var compiled = _.template(mobanstring);

        $.get("/news",function(data,status){
            for(var i = 0 ; i < data.length ; i++){

                //给模板编辑传递值
                var compiledString = compiled(data[i]);

                //把生成的HTML内容追加到页面上
                $(".container").append(compiledString);
            }


        });
    </script>

  </body>

. MongoDB数据库(cls命令清屏)

 1.运行mongo命令,进到安装目录下的bin文件夹,或者是配置环境变量

 2.进到bin之后,开启数据库服务,用命令./mongod --dbpath  真实存放数据的数据库的绝对路径,也就是说数据库文档所在的文件夹.

 3.用命令./mongo连接数据库

 4.use database 使用database(database是数据库名称)数据库,创建数据库
   如果要想把这个数据库创建成功,那么必须插入一条数据
   数据库中不能直接插入数据,只能往集合(collections)中插入数据.集合不需要创建
   db.student.insert({"name":"小花"});其中student就是一个集合

 5.show dbs  显示数据库

 6.db显示当前使用的数据库

   show collections
   显示数据库中所有的集合(collection

   查询指定数据库统计信息
   db.stats()

 7.mongoimport命令
   mongoimport --db test --collection student --drop --file stu.json
   --db test 想往哪个数据库中导入数据
   --collection student 想往数据库中的哪个集合导入数据
   --drop 导入之前把集合清空
   --file stu.json 要导入的json文件



 MongoDB的基本命令

     use 命令
     MongoDB use DATABASE_NAME 用于创建数据库。该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库。


     dropDatabase() 方法
     MongoDB db.dropDatabase() 命令是用来删除一个当前连接服务的数据库。

     drop() 方法
     MongoDB db.collection.drop() 是用来从数据库中删除一个集合。其中collection就是那个集合的名称.


     insert() 方法
     db.teacher.insert({"name":"xiaozhang","kemu":"shuxue"});
     要插入数据到 MongoDB 集合,需要使用 MongoDB 的  insert() save() 方法。

     update()方法
     sjpwd({"name":"小红"},{$set:{"id":2}});
     更新文档

     find() 方法
     db.teacher.find();
     要从MongoDB 查询集合数据,需要使用MongoDB find() 方法。


     pretty() 方法
     db.teacher.find().pretty();
     结果显示在一个格式化的方式,可以使用 pretty() 方法.


     Limit() 方法
     skip() 方法
     db.teacher.find().pretty().limit(1);
     要限制 MongoDB 中的记录,需要使用 limit() 方法。 limit() 方法接受一个数字型的参数,这是要显示的文档数。
     skip() 方法接受一个数字型的参数,这是要略过的文档数。

     语法:
     limit() 方法的基本语法如下
     >db.COLLECTION_NAME.find().limit(NUMBER)


     MongoDB 数据转储
     创建备份MongoDB中的数据库,应该使用mongodump命令。

     mongodump命令的基本语法如下:
     >mongodump


     恢复数据
     恢复备份数据使用MongoDB mongorerstore 命令。此命令将恢复所有的数据从备份目录。

     语法:
     mongorestore命令的基本语法
     >mongorestore



.cookiesession,加密
   
  1.cookie的使用,需要引包cookie-parser

    var express = require("express");
    var cookieParser = require("cookie-parser");

    var app = express();
    //使用cookie-parser 中间件
    app.use(cookieParser());


    app.get('/', function(req, res) {
        //设置cookie
        res.cookie("xihao","tybody",{maxAge:900000,httpOnly:true});
        res.send(req.cookies);
    })

    app.get("/xihao", function (req,res) {
        //得到get 请求
        var xh = req.query.xh;

        //记录用户喜好
        var xhArr = req.cookies.xh || [];
        xhArr.push(xh);
        //设置cookie
        res.cookie("xh",xhArr,{maxAge:900000,httpOnly:true});
        res.send("喜好:" + xhArr);

    });



  2.session的使用,需要引包express-session

      var express = require("express");
      var session = require("express-session");

      var app = express();

      //设置seddion中间件
      app.use(
          session({
              secret:'keyboard cat',
              resave:false,
              saveUninitialized:true
          })
      );

      app.get("/",function(req,res){
          if(req.session.login == "1"){
              res.send("欢迎"+req.session.username);
          }else {
              res.send("你还没有登录");
          }
      });

      app.get("/login", function (req,res) {
         //设置session
          req.session.login = "1";
          req.session.username = "kaola";
          res.send("你已经登录成功");
      });

      app.listen(3000);



    3.加密(引包crypto)

      var crypto = require("crypto");
      module.exports = function (mingma) {
          var md5 = crypto.createHash("md5");
          var password = md5.update(mingma).digest("base64");
          return password;
      }

      var password = md5(req.query.password);


.图片处理

   第一步: 首先要安装GraphicsMagick 这个服务
   第二步: nodejs中引gm

   只需要这两不就可以完成常用的图片操作了.

 

posted @ 2017-09-27 14:08  云姐姐  阅读(180)  评论(0编辑  收藏  举报