美文网首页
03-Node.js

03-Node.js

作者: XAbo | 来源:发表于2022-03-15 09:15 被阅读0次

    Node.js是基于Chrome V8引擎的JS的后端运行环境,前端运行环境是浏览器。Node.js不能调用Web API。

    一、初识Node.js

    1.1 概述

    Node.js运行环境 Node.js应用场景 Node.js学习路线

    1.2 基础

    1.2.1 CommonJS

    CommonJS

    原文链接:https://blog.csdn.net/u012060033/article/details/102753195
    Node程序由许多个模块组成,每个模块就是一个文件。Node模块采用了CommonJS规范;根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。

    CommonJS模块的特点如下

    • 所有代码都运行在模块作用域,不会污染全局作用域。
    • 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
    • 模块加载的顺序,按照其在代码中出现的顺序。

    如果想在多个文件分享变量,必须定义为global对象的属性。CommonJS规定,每个文件的对外接口是module.exports对象。

    module:每个模块内部,都有一个module对象,代表当前模块。它有以下属性。

    module.id 模块的识别符,通常是带有绝对路径的模块文件名。
    module.filename 模块的文件名,带有绝对路径。
    module.loaded 返回一个布尔值,表示模块是否已经完成加载。
    module.parent 返回一个对象,表示调用该模块的模块。
    module.children 返回一个数组,表示该模块要用到的其他模块。
    
    • module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。
    • 为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。

    注意,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。如果你觉得,exports与module.exports之间的区别很难分清,那就放弃使用exports,只使用module.exports。

    1.2.2 第三方模块-包

    #查询当前的服务器地址
    npm config get registry
    #永久切换镜像源  或者使用nrm工具
    npm config set registry https://registry.npm.taobao.org
    #临时切换镜像源
    npm install --registry=https://registry.npm.taobao.org
    #检查镜像是否下载成功
    npm config get registry
    

    npm工具在安装Node.js的时候已经安装,用来在registry.npmjs.org下载所需包。

    版本规范
    • 2.安装包 npm install xxx
    • 3.package.json管理包;
    • 4.安装所有依赖包:npm install 或者 npm i
      4.1 内网安装:https://www.jb51.net/article/151349.htm
      4.2 开发阶段的包:npm i xx -D ;全程:npm install xx --save-dev
      4.3 全局包:npm i xx -g
    • 5.卸载包:npm uninstall

    二、Node.js内置API

    2.1 fs 模块

    参考:https://www.cnblogs.com/starof/p/5038300.html
    fs 模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。

    使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式。

    2.1.1 同步和异步

    #####异步写法
    var fs = require('fs'); // 载入fs模块
    fs.unlink('/tmp/shiyanlou', function(err) {
        if (err) {
            throw err;
        }
        console.log('成功删除了 /tmp/shiyanlou');
    });
    #####同步步写法
    fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
    console.log('成功删除了 /tmp/shiyanlou');
    

    2.1.2 读取文件

    fs.readFile(filename,[option],callback) 方法读取文件。
    readFile同步的写法就是没有回调函数:fs.readFileSync(filename,[options])。

    // 设置编码格式
    fs.readFile('./test.txt', 'utf-8', function(err, data) {
        // 读取文件失败/错误
        if (err) {
            throw err;
        }
        // 读取文件成功
        console.log('utf-8: ', data.toString());
      //直接用console.log(data);也可以
    });
    

    2.1.3 写入文件

    使用fs.writeFile(filename,data,[options],callback)写入内容到文件。

    var fs = require('fs'); // 引入fs模块
    
    // 写入文件内容(如果文件不存在会创建一个文件)
    // 传递了追加参数 { 'flag': 'a' }
    fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, function(err) {
        if (err) {
            throw err;
        }
    
        console.log('Saved.');
    
        // 写入成功后读取测试
        fs.readFile('./test2.txt', 'utf-8', function(err, data) {
            if (err) {
                throw err;
            }
            console.log(data);
        });
    });
    

    补充:fs.read和fs.write功能类似fs.readFile和fs.writeFile(),但提供更底层的操作,实际应用中多用fs.readFile和fs.writeFile。使用fs.read和fs.write读写文件需要使用fs.open打开文件和fs.close关闭文件。

    2.1.4创建目录

    使用fs.mkdir(path,[mode],callback)创建目录

    var fs = require('fs'); // 引入fs模块
    
    // 创建 newdir 目录
    fs.mkdir('./newdir', function(err) {
        if (err) {
            throw err;
        }
        console.log('make dir success.');
    });
    

    2.1.5读取目录

    使用fs.readdir(path,callback)读取文件目录。

    var fs = require('fs'); // 引入fs模块
    
    fs.readdir('./newdir', function(err, files) {
        if (err) {
            throw err;
        }
        // files是一个数组
        // 每个元素是此目录下的文件或文件夹的名称
        console.log(files);
    });
    

    2.2 path模块

    是Node官方提供的、用来处理路径的模块,它提供了一系列的方法和属性,用来满足用户对路径的处理。
    转载:https://www.jianshu.com/p/fe41ee02efc8

    2.2.1 路径解析,得到规范化的路径格式

    //引用该模块
    var path = require("path");
    //对window系统,目录分隔为'\', 对于UNIX系统,分隔符为'/',针对'..'返回上一级;/与\\都被统一转换
    //path.normalize(p);
    var myPath = path.normalize(__dirname + '/test/a//b//../c/utilyou.mp3');
    console.log(myPath); //windows: E:\workspace\NodeJS\app\fs\test\a\c\utilyou.mp3
    

    2.2.2 路径结合、合并,路径最后不会带目录分隔符

    var path1 = 'path1',
        path2 = 'path2//pp\\',
        path3 = '../path3';
    var myPath = path.join(path1, path2, path3);
    console.log(myPath); //path1\path2\path3
    

    2.2.3 获取绝对路径

    var myPath = path.resolve('path1', 'path2', 'a/b\\c/');
    console.log(myPath);//E:\workspace\NodeJS\path1\path2\a\b\c
    

    2.2.4 获取相对路径

    var from = 'c:\\from\\a\\',
             to = 'c:/test/b';
    var _path = path.relative(from, to);
    console.log(_path); //..\..\test\b; 表示从from到to的相对路径
    

    2.2.5 获取目录

    var myPath = path.dirname(__dirname + '/test/util you.mp3');
    console.log(myPath);
    

    2.2.6 获取文件名称

    var myPath = path.basename(__dirname + '/test/util you.mp3', '.mp3');
    console.log(myPath);
    

    2.2.7 获取路径中的扩展名

    //获取路径中的扩展名,如果没有'.',则返回空
    path.extname(path)
    

    2.2.8返回操作系统中文件分隔符

    //返回操作系统中文件分隔符; window是'\\', Unix是'/'
     path.sep属性
    

    2.2.9 返回操作系统中目录分隔符

    //返回操作系统中目录分隔符,如window是';', Unix中是':'
    path.delimiter属性
    

    2.3 http模块

    是Node.js官方提供的用来创建Web服务器的模块。
    http模块主要用于创建http server服务,支持更多特性、不缓冲请求和响应处理流相关。
    转载:https://www.cnblogs.com/starof/p/5038890.html

    2.3.1 示例

    1.server.js:创建http服务,监听请求,让route处理。

    //
    // 创建http server
    //
    
    // 加载所需模块
    var http = require('http');
    var url = require('url');
    var fs = require('fs');
    
    // 设置ip和端口
    // 实际应用中,可以把这些写到配置文件中
    var host = '127.0.0.1',
        port = 8080;
    
    // 创建http server
    function start(route, handle) {
        // 参数
        // route  判断url是否存在,存在则调用handle处理,不存在则返回404
        // handle 处理不同的url请求
    
    
        // 处理request请求
        function onRequest(req, res) {
            // 使用url.parse()方法解析url
            // 它会把url string转化为一个object
            // 这样我们就可以很方便的获取url中的host、port、pathname等值了
            var pathname = url.parse(req.url).pathname;
            console.log('Request for ' + pathname + ' received.');
    
            // 判断并处理不同url请求
            // 后面介绍此方法
            route(handle, pathname, res, req);
        }
    
        // 使用http.createSserver()方法创建http server
        // 并传入onRequest()方法
        // 然后使用listen()方法监听指定地址
        http.createServer(onRequest).listen(port, host);
        console.log('Server has started and listening on ' + host + ':' + port);
    }
    
    // 导出 start 方法
    exports.start = start;
    

    2.router.js:route判断url是否存在,存在则调用handle处理,不存在则返回404。

    var fs = require('fs');
    
    // 路由函数
    // 处理不同url的请求
    // 并返回相应内容
    
    function route(handle, pathname, res, req) {
        console.log('About to route a request for ' + pathname);
    
        // 判断此url是否存在特定处理函数
        // 存在则调用handle处理
        // 不存在则返回404页面
        if (typeof handle[pathname] === 'function') {
            // 后面介绍handle函数
            handle[pathname](res, req);
        } else {
            console.log('No request handler found for ' + pathname);
    
            // 读取404页面
            // 所有页面都存放在view文件夹下
            var content = fs.readFileSync('./views/404.html');
            res.writeHead(404, { 'Content-Type': 'text/html' });
            res.write(content);
            res.end();
        }
    }
    // 导出 route 方法
    exports.route = route;
    

    3.requestHandlers.js:handle处理不同的url请求。

    // 处理url请求
    
    var fs = require('fs');
    
    // home.html 主页
    function home(res) {
        console.log('Request handler "home" was called.');
    
        // 读取home.html文件
        var content = fs.readFileSync('./views/home.html');
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.write(content);
        res.end();
    }
    
    // about.html 关于页面
    function about(res) {
        console.log('Request handler "about" was called.');
    
        // 读取about.html文件
        var content = fs.readFileSync('./views/about.html');
        res.write(200, { 'Content-Type': 'text/html' });
        res.write(content);
        res.end();
    }
    
    // 导出页面处理函数
    exports.home = home;
    exports.about = about;
    

    4.主程序main.js

    // 主程序
    
    // 引入server,router及requestHandler
    var server = require('./server');
    var router = require('./router');
    var requestHandlers = require('./requestHandlers');
    
    // 保存url处理方法
    var handle = {};
    handle['/'] = requestHandlers.home;
    handle['/about'] = requestHandlers.about;
    
    // 启动http server
    server.start(router.route, handle);
    

    三、Node.js第三方API

    第三方模块加载机制

    3.1 Express

    基于Node.js平台,快速、开放、极简的 Web 开发框架。作用与http模块类似。

    详见:https://www.expressjs.com.cn/starter/installing.html

    const express = require('express')
    const app = express()
    const port = 3000
    app.get('/', (req, res) => {
      res.send('Hello World!')
    })
    app.listen(port, () => {
      console.log(`Example app listening on port ${port}`)
    })
    
    中间件分类 自定义中间库 模块化路由

    相关文章

      网友评论

          本文标题:03-Node.js

          本文链接:https://www.haomeiwen.com/subject/bncsdrtx.html