美文网首页
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

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

网友评论

      本文标题:03-Node.js

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