node 入门到放弃,慢慢学习nodejs

1. node的安装和版本工具

官网:https://nodejs.org/en/

  • window选择.msi安装包
  • Mac上的homebrew,Linux上的yum、dnf等
  • 推荐安装14.17以上版本

版本管理

这里mac推荐使用版本管理工具 n

  1. 安装 n
npm install -g n
# 查看安装的版本表示安装成功
n --version
  1. 安装最新的lts版本
    权限问题需要添加 sudo
# 安装最新的lts版本
n lts
# 安装最新的版本
n latest

# 查看所有的版本
n

windows系统上使用nvm-windows
下载链接:https://github.com/coreybutler/nvm-windows
安装指定版本, 基本使用命令

# 查看可用版本
nvm list available
# 安装指定版本
nvm install 14.13.1
# 安装最新的lts版本(若不可用则安装指定版本方式安装)
nvm install lts
# 安装最新的版本
nvm install latest

# 可设置nvm淘宝镜像
nvm node_mirror https://npm.taobao.org/mirrors/node/
nvm npm_mirror https://npm.taobao.org/mirrors/npm/

node的全局对象

  1. 特殊的全局对象
    在模块中任意使用,但在命令行交互中不能使用
    包括:__dirname、__filename、exports、module、require()
    __dirname:获取当前文件所指的路径(不包括后面的文件名)
    __filename:获取当前文件所在的路径和文件名称
  2. 常见的全局对象
    • process对象:提供了Node进程中的相关的信息
    • console对象:输出日志
    • 定时器函数
      setTimeout(callback, delay[, ...args])
      setInterval(callback, delay[, ...args])
      setImmediate(callback[, ...args]) 回调事件“立即”执行
      process.nextTick(callback[, ...args]) 添加到下一次tick队列中

node 内置模块

1. 内置模块path

  1. 从路径中获取信息
const path = require('path');

const filepath = "/User/admin/abc.txt";
// 获取文件的父文件夹
console.log(path.dirname(filepath)); // /User/admin
// 获取文件名
console.log(path.basename(filepath)); // abx.txt
// 获取文件扩展名
console.log(path.extname(filepath)); // .txt
  1. 路径的拼接join 相当于字符串的拼接
const path = require('path');

const basepath = "/User/admin";
const filename ="abc.txt";
// 路径的拼接
const filepath = path.join(basepath, filename);
console.log(filepath); // /User/admin/abc.txt
  1. resolve路径拼接
const path = require('path');

const basePath = '/User/admin';
const filename = 'abc.txt';

const filepath = path.resolve(basePath, filename);
console.log(filepath); // /User/admin/abc.txt

join拼接的区别

  • resolve函数会判断我们拼接的路径前面是否有 /.././;
  • 如果有表示是一个绝对路径,会返回对应的拼接路径;
  • 如果没有,那么会和当前执行文件所在的文件夹进行路径的拼接
  • join 相当于字符串的拼接

2. 内置模块 fs

  1. 获取一个文件的状态
const fs = require("fs/promises");

const filepath = "./abc.txt";
fs.stat(filepath).then(res => {
  console.log(res.isDirectory());
}).catch(e => {
  console.error(e)
})
  1. 文件描述符
  • fs.open() 方法用于分配新的文件描述符。
  • 一旦被分配,则文件描述符可用于从文件读取数 据、向文件写入数据、或请求关于文件的信息。
  1. 文件的读写
  • fs.readFile(path[, options], callback):读取文件的内容;
  • fs.writeFile(file, data[, options], callback):在文件中写入内容;
  • 使用fs.mkdir()或fs.mkdirSync()创建一个新文件夹

option参数:

  • flag:写入的方式。取值:
    w 打开文件写入,默认值;
    w+打开文件进行读写,如果不存在则创建文件;
    r+ 打开文件进行读写,如果不存在那么抛出异常;
    r打开文件读取,读取时的默认值;
    a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;
    a+打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件
  • encoding:字符的编码;基本用的都是UTF-8编码。
const fs = require("fs/promises");
const filepath = "./abc.txt";
// 1. 写文件
fs.writeFile(filepath, "world", {flag: "a"}).then(res => {
  console.log(res); // 返回null 表示写入成功
}).catch(console.error)

// 2. 文件读取
fs.readFile(filepath).then(res => {
	// 不传 encoding ,会返回 Buffer
	console.log(res)
})
fs.readFile(filepath, { encoding: 'utf-8' }).then(res => {
	console.log(res)
})

// 3. 创建文件夹
const dirname = "./test";
fs.mkdir(dirname).then((result) => {
  // 创建成功返回 undefined
  console.log(result);
}).catch((err) => {
  // 目录已存在,返回 {code: 'EEXIST'}
  console.log(err);
});
// 4. 读取目录下的文件
fs.readdir(dirname).then((result) => {
  // [ 'xxx.txt' ]
  console.log(result);
}).catch((err) => {
  console.error(err);
});
// 递归获取目录下的子目录的文件
function getFiles(dirname) {
  fs.readdir(dirname, { withFileTypes: true }).then(files => {
    for(let file of files) {
      if(file.isDirectory()) {
        const filepath = path.resolve(dirname, file.name);
        getFiles(filepath)
      }else{
        console.log(file.name);
      }
    }
  })
}

getFiles(dirname)

// 5. 重命名
fs.rename('./test', './foo').then((result) => {
  console.log(result); // 成功返回undefined
}).catch((err) => {
  console.error(err);
});

3. 内置模块 events

Node中的核心API都是基于异步事件驱动的:

  • 在这个体系中,某些对象(发射器(Emitters))发出某一个事件;
  • 我们可以监听这个事件(监听器 Listeners),并且传入的回 调函数,这个回调函数会在监听到事件时调用;
const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on("click", args => {
  console.log("监听1的click事件", args);
})

const listener2 = args => {
  console.log("监听2的click事件", args);
}
emitter.on("click", listener2);

setTimeout(() => {
  emitter.emit("click", "hello", "world");
  // 取消2的监听
  emitter.off("click", listener2);

  emitter.emit("click", "hello02", "world02")
}, 1000);

方法的补充

  • emitter.once(eventName, listener) :事件监听一次
  • emitter.prependListener():将监听事件添加到最前面
  • emitter.prependOnceListener():将监听事件添加到最前面,但是只监听一次
  • emitter.removeAllListeners([eventName]):移除所有的监听器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node-RED是工业网物联网的重要组成部分,我最开始接触Node-RED,也算是一个偶然的机会吧,上班后领导安排我的第一个任务就是调研一下Node-RED,我之后上网查了一下,那个时候网上相对于Node-RED的资料也比较少,只知道它是IBM公司的一个开源项目。直到最近,发现许多大公司的产品都支持Node-RED,比如西门子公司的IoT2000,研华公司的WISE PaaS 网关,美国OPTO 22等设备中都安装了Node-RED,表明它在工业物联网和控制中已经广泛应用了。 那么工业物联网为什么要用它?它又处于工业物联网那个层次?它具有哪些特性?它帮助物联网解决了什么问题?为什么说它是柔性动态可重构的解决方案呢? ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 本门课程,老师将带领你从Node-RED的发展,工业物联网定位开始讲解,并带领着大家进行手把手安装Node-RED,实际操作演练Node-RED,并搭建一个物联网小平台,给大家带来更好的学习效果。  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 为了能够让小伙伴们快速了解本门课程的结构,本门课程从以下几个方面展开:Node-RED入门Node-RED安装与配置Node-RED教学实战Node-RED的优势与不足Node-RED能为我们带来什么Node-RED总结与展望

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值