zoukankan      html  css  js  c++  java
  • 【七天】NodeJS学习总结

    第一天

    一.  使用http模块API

    1. 回调响应

    // 不推荐使用
    res.write('hello')
    res.write(' world')
    res.end()
    
    // 推荐使用
    res.end('hello world')

    4. 设置Content-Type

    (text/plain)数据类型可以看网址:https://tool.oschina.net/commons

    如果返回的是图片数据就不要指定编码了,我们常说的编码是字符编码

    // 通知浏览器返回普通字符串文本数据;utf-8编码。让浏览器用相应编码去解码数据,不至于乱码
    
    res.setHeader('Content-Type', 'text/plain; charset=utf-8')

    5. 读取文件出错返回return

    阻止node.js的后续代码执行,方法返回值

    6. 根据客户端请求返回不同资源

      解析客户端请求路径

      判断利用fs文件读写模块返回不同资源

    7. 使客户端重定向

      设置状态码为302:临时重定向浏览器不会记住

      在响应头告诉客户端重定向网址

      客户端收到302就会去location找跳转地址跳过去

    res.statusCode = '302'
    res.setHeader('Location', '/')
    res.end()
    

     注:如果使用301永久重定向,那么只要访问一次浏览器就会缓存记住,下次就不会请求服务端会直接跳转过去

    二. node.js使用模板引擎:例:art-template

    模板引擎不关心你的字符串内容,只关心自己能认识的模板标记语法,如:{{}}

    1. art-template不仅能在浏览器使用也能在node.js使用

    // 安装:
    npm install art-template
    // 引入,npm是什么requeire就是什么:
    var template = require('art-template')
    // 根据api进行调用

    2. 服务端渲染和客户端渲染

    渲染就是看模板引擎在哪里使用:

      服务端渲染:服务端使用模板引擎返回给客户端渲染后的html

      客户端渲染:客户端使用模板引擎,通过ajax从服务端拿到数据渲染页面

    两者渲染区别:

      客户端渲染不利于SEO搜索引擎优化(找不到你,解析不了你的内容)

      服务端渲染可以被爬虫抓取到,客户端渲染时很难被爬虫抓到的

      

    三. 使用url模块API

    1. 获得链接get参数

     url.parse(urlString,boolean,boolean)

      parse这个方法可以将一个url的字符串解析并返回一个url的对象

      参数:urlString指传入一个url地址的字符串

         第二个参数(可省)传入一个布尔值,默认为false,为true时,返回的url对象中,query的属性为一个对象。

    var url = request('url')
    var obj = url.parse('/test?name=ming&messape=hello')
    // 拿到?后面参数并转成json字符串
    console.log(obj.query)

    四. 进入REPL(交互式解释器)

    类似 Window 系统的终端或 Unix/Linux shell,就像浏览器的调试窗口console,我们可以在终端中输入命令,并接收系统的响应。轻量级即编即用

    Node 自带了交互式解释器,可以执行以下任务:

    • 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。

    • 执行 - 执行输入的数据结构

    • 打印 - 输出结果

    • 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。

    我们可以输入以下命令回车来启动 Node 的终端:

    node
    

    第二天

    一.  服务端语言 + 运行环境(提供API,编译器,持续运行)

    Apache和Nginx封装了很多底层变成配置文件,还封装了很多底层提供API,让语言编写更加简单

    Node更灵活,没有封装底层,需要自己用语言编写

    PHP + Apache

    PHP + Nginx

    JS + Node

    二. commenJS语法,模块管理

    1.. 引入模块

    引入内部模块需要用相对路径,如:

    var t = require('./test')

    引入模块优先从缓存中加载,所以如果这个模块被引用过了,其他模块再引用这个模块,它不会执行代码,只会拿到这个模块对象:简单来说模块代码不管被引用多少次,它只会执行一次

    2. 模块作用域

       node没有全局作用域,只有模块作用域,每个模块即使相同命名也毫不影响

      node模块之间通讯利用exports:可以导出多个成员利用对象

    // 模块a
    exports.test = 'hello'
    
    // 模块b
    // request('./a')等价模块a的exports
    var ret = request('./a')
    console.log(ret.test)

    直接导出单个成员,也可以导出多个成员给module.exports赋值对象就行

    // 模块a
    // 错误导出:exports = 'hello'
    // 正确导出:也可以导出方法
    module.exports = 'hello'
    
    // 模块b
    var ret = request('./a')
    console.log(ret)

    3. 导出原理:

    node为了简化操作默认会有一个exports,如果直接赋exports值会生成新的引用,这时exports和module.exports指向不同引用,那么导出的module.exports没有赋值自然就是空对象了

    // 默认每个模块隐含代码
    var module {
        exports: {}
    }
    // node为了简化操作默认代码,指针指向同一对象
    var exports = module.exports

    // 我们的代码就是写在这 return module.exports;

    第三天

    一. 修改完代码自动重启服务

    使用第三方工具启动服务:nodemon,当代码发生变化会自动重启服务

    1. 安装:npm install --global nodemon

    2. 启动服务: nodemon app.js

    二. 传统http和express区别

    三. 懒人显示启动服务

    // 获得本机ip方法定义
    var os = require('os');
    
    function getIPAdress() {
        var interfaces = os.networkInterfaces();
        for (var devName in interfaces) {
            var iface = interfaces[devName];
            for (var i = 0; i < iface.length; i++) {
                var alias = iface[i];
                if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
                    return alias.address;
                }
            }
        }
    }
    // 启动服务提示
    server.listen(3000, () => {
        console.log('本机地址:x1B[36m%sx1B[0m', 'http://localhost:3000');
        console.log('局域网地址:x1B[36m%sx1B[0m', 'http://' + getIPAdress() + ':3000');
    });

    第四天

    如果想要获得一个函数中异步操作内容,必须通过回调函数来获取,传入回调函数给这个函数

    第五天

    使用MongoDB

    一. 安装数据库,配置环境变量

    二. 开关MongoDB数据库

    注:默认使用执行DOS命令mongod所处盘符下根目录下的/data/db

      所以在第一次执行命令启动服务时要自己手动新建一个/data/db,不然找不到此目录会启动服务失败

    // 启动服务
    mongod
    // 关闭服务
    1. 在开启服务的控制台,直接Ctrl+C即可停止
    2. 或者直接关闭开启服务的控制台也可以

    三. 连接数据库

    // 默认连接本地开启的MongoDB数据库
    mongo
    // 退出连接
    exit

    第六天

    使用MongoDB的云数据库

    教程链接:https://www.cnblogs.com/xybaby/p/9460634.html

    第七天

    一. path路径操作模块

    参考文档:https://nodejs.org/docs/latest-v13.x/api/path.html

    • path.basename:获取路径的文件名,默认包含扩展名
    • path.dirname:获取路径中的目录部分
    • path.extname:获取一个路径中的扩展名部分
    • path.parse:把路径转换为对象
      • root:根路径
      • dir:目录
      • base:包含后缀名的文件名
      • ext:后缀名
      • name:不包含后缀名的文件名
    • path.join:拼接路径
    • path.isAbsolute:判断一个路径是否为绝对路径

    二. Node中的其它成员(__dirname,__filename)

    在每个模块中,除了require,exports等模块相关的API之外,还有两个特殊的成员:

    • __dirname,是一个成员,可以用来动态获取当前文件模块所属目录的绝对路径

    • __filename,可以用来动态获取当前文件的绝对路径(包含文件名)

    • __dirnamefilename是不受执行node命令所属路径影响的

    在文件操作中,使用相对路径是不可靠的,因为node中文件操作的路径被设计为相对于执行node命令所处的路径。

    所以为了解决这个问题,只需要把相对路径变为绝对路径(绝对路径不受任何影响)就可以了。

    就可以使用__dirname或者__filename来帮助我们解决这个问题

    在拼接路径的过程中,为了避免手动拼接带来的一些低级错误,推荐使用path.join()来辅助拼接

    var fs = require('fs');
    var path = require('path');
    
    // console.log(__dirname + 'a.txt');
    // path.join方法会将文件操作中的相对路径都统一的转为动态的绝对路径
    fs.readFile(path.join(__dirname + '/a.txt'),'utf8',function(err,data){
        if(err){
            throw err
        }
        console.log(data);
    });

    三. 子模板和模板的继承(模板引擎高级语法)【include,extend,block】

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>模板页</title>
        <link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css"/>
        {{ block 'head' }}{{ /block }}
    </head>
    <body>
        <!-- 通过include导入公共部分 -->
        {{include './header.html'}}
        
        <!-- 留一个位置 让别的内容去填充 -->
        {{ block  'content' }}
            <h1>默认内容</h1>
        {{ /block }}
        
        <!-- 通过include导入公共部分 -->
        {{include './footer.html'}}
        
        <!-- 公共样式 -->
        <script src="/node_modules/jquery/dist/jquery.js" ></script>
        <script src="/node_modules/bootstrap/dist/js/bootstrap.js" ></script>
        {{ block 'script' }}{{ /block }}
    </body>
    </html>
    <!-- 继承(extend:延伸,扩展)模板也layout.html -->
    <!-- 把layout.html页面的内容都拿进来作为index.html页面的内容 -->
    {{extend './layout.html'}}
    
    <!-- 向模板页面填充新的数据 -->
    <!-- 填充后就会替换掉layout页面content中的数据 -->
    <!-- style样式方面的内容 -->
    {{ block 'head' }}
        <style type="text/css">
            body{
                background-color: skyblue;
            }
        </style>
    {{ /block }}
    {{ block 'content' }}
        <div id="">
            <h1>Index页面的内容</h1>
        </div>
    {{ /block }}
    <!-- js部分的内容 -->
    {{ block 'script' }}
        <script type="text/javascript">
            
        </script>
    {{ /block }}

    四. 中间件

    注意:MongoDB数据设计时间戳

    // 时间戳数据字设计
    create_time: {
        type: Date,
        // 注意:这里不要写Date.now(),因为会即刻调用
        // 这里直接给了一个方法,如果创建数据的时候没有传create_time,这时mongoose就会自动调用这个方法赋值
        default: Date.now
    }

    使用express-session

    作者:dlm17
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    锚点
    autoLayout
    基础动画
    核心动画
    get和post的区别
    block的定义及使用
    传值-自定义构造函数传值
    字符串
    字典与可变字典
    RabbitMQ的可视化界面进行操作
  • 原文地址:https://www.cnblogs.com/dlm17/p/12546999.html
Copyright © 2011-2022 走看看