node基础教程

镜像源搭建服务器文件解压缩文件夹压缩判断资源是否存在遍历文件夹文件读写新建文件夹并写入文件文件删除文件夹删除执行外部脚本休眠json文件解析美化打印文件拷贝文件名处理对称加密和解密三种常用加密算法

镜像源

  • npm服务器在国外,国内虽然能用,但是下载东西很慢,由此,很多镜像产生

  • 镜像的意义就是把网络资源映射到国内,加快访问速度,内容和国外资源是一致的,每隔一段时间同步一次

  • nrm就是切换镜像源的利器

  • 注意:这东西仅仅改变镜像源,安装依赖还得用npm,不是nrm

基本命令

npm i -g nrm 安装

nrm ls 查看所有可用镜像,以及当前使用的镜像

nrm use taobao 切换镜像源

nrm test taobao 测速

搭建服务器

  • 使用内置http模块快速搭建服务器

  • 推荐全局安装nodemon模块 npm i -g nodemon

  • 启动后监听文件变化,更改文件后,不需要打断重启

//app.js
//引入核心模块http
var http = require("http");
//创建服务器

var server = http.createServer(function(request,response){  
     response.end("hello world");
});

//运行服务器,监听3000端口(端口号可以任改,业内推荐3000+)
server.listen(3000,function(){
   console.log("服务器启动成功...");
});

nodemon app.js  启动项目


node基础教程_nodenodemon热更新

文件解压缩

// 压缩
const fs = require('fs');
const zlib = require('zlib');

const gzip = zlib.createGzip();

const  input= fs.createReadStream('./1.txt');
const output= fs.createWriteStream('./1.txt.zip');

input.pipe(gzip).pipe(output);

// 解压

var fs = require("fs");
var zlib = require('zlib');

// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream('input.txt'));

console.log("文件解压完成。");

文件夹压缩

// 安装 npm i compressing
const compressing = require('compressing');
//folder为自定义要压缩的文件夹
compressing.zip.compressDir(folder, folder+'.zip')
.then(() => {
    console.log('ok');
})
.catch(err => {
    console.log(err);
    return
});

判断资源是否存在

   const fs=require("fs")

    //目标文件夹不存在即创建

  if (fs.existsSync(target) === false) {
        fs.mkdirSync(target)
    }

遍历文件夹

const fs = require('fs');
const path = require('path');
const folderPath = path.resolve('./testFolder');//指定要遍历的文件夹路径

const cycleFolder = (folderPath) => {
    //根据指定要遍历的文件夹路径,返回文件列表数组,保存在files中
    fs.readdir(folderPath, (err, files) => {
        if (err) throw err;
        files.forEach(filename => {  //遍历读取到的文件列表数组
            const absolutePath = path.join(folderPath, filename);  //获取当前文件的绝对路径
            //根据 fs.stat方法,返回一个提供有关文件的信息fs.Stats对象
            fs.stat(absolutePath, (err, stats) => {
                if (err) throw err;
                const flag = stats.isDirectory();//文件夹递归遍历,文件直接输出绝对路径
                flag ? cycleFolder(absolutePath) : console.log(absolutePath);
            })
        });
    });
}

//调用文件夹遍历方法
cycleFolder(folderPath)

文件读写

node中大部分模块都是异步,fs中基本都实现了同步写法,若不习惯异步,用Sync同步方法即可(readFileSync)

       //读文件
    var fs = require('fs')   
    fs.readFile('./a.txt', function (error, data) {
          if (error) {
            console.log('读取文件失败')
          } else {
            console.log(data.toString());//读取结果是二进制,要转化成我们认识的
          }
    })

        //写文件

    var fs = require('fs')
    fs.writeFile('./a.txt', '冷月心', function (error) {
      if (error) {
        console.log('写入失败');
      } else {
        console.log('写入成功');
      }
    })

新建文件夹并写入文件

var fs = require('fs');

fs.mkdir('./a', function (err) {
    if (!err) {
        fs.writeFile('./a/1.txt', 'hello ', function (err) {
            if (err) {
                console.log('写入失败', err);
            } else {
                console.log('写入成功');
            }
        })
    }

})

文件删除

var fs = require('fs');

fs.unlink('./a/1.txt', function (err) {

   if(!err) console.log('删除成功')

})

文件夹删除

const fs = require('fs');


 const deleteFolder=(path)=> {
    let files = [];
    if( fs.existsSync(path) ) {
        files = fs.readdirSync(path);
        files.forEach(file=>{
            let curPath = path + "/" + file;
            if(fs.statSync(curPath).isDirectory()) {
                deleteFolder(curPath);
            } else { 
                fs.unlinkSync(curPath);
            }
        });
        fs.rmdirSync(path);
        console.log('删除成功')
    }
}



deleteFolder(path);

执行外部脚本

// 须在Linux环境执行 win系统可以用git bash
var { execSync } = require('child_process');
var path = require("path");
var originFolder = path.resolve(__dirname, "origin");
var nowFolder = path.resolve(__dirname, "now");


try {
    execSync(`cp -r ${originFolder} ${nowFolder} `)
    console.log("复制成功")
} catch (e) {
    console.log("复制失败:"+e.message)

}

休眠

// 休眠十秒
var { spawn } = require("child_process")
spawn("sleep", ['10'])

json文件解析

node基础教程_node_02

美化打印

/**
 * @param1 待序列化对象
 * @param2 是否显示更多的隐藏信息
 * @param3 递归深度,默认2,设置null则不限制递归层级
 * @param4 颜色显示
 * 
 */

var util=require('util');

var obj={
    name:"tom",
    age:18,
    hobby:['吃饭','睡觉','打豆豆']


}

 console.log(util.inspect(obj,true,2,true));

node基础教程_node_03美化打印

文件拷贝

var fs = require('fs')
function fileCopy(src, target) {
        const readStream = fs.createReadStream(src)//源文件路径
        const writeStream = fs.createWriteStream(target)//目标文件路径
        readStream.pipe(writeStream);
}

fileCopy('./1.txt', './2.txt')

文件名处理

//获取自定义格式的文件名

const path = require('path');
const getFileName = (filepath, type = 1) => {
    let result = '';
    if (type === 1) {
        result = path.basename(filepath);
    } else if (type === 2) {
        result = path.extname(filepath);
    } else {

        let basename = path.basename(filepath);
        let extname = path.extname(filepath);
        result = basename.substring(0, basename.indexOf(extname));
    }
    return result;
}



// console.log(getFileName("./date.js", 1))//date.js
// console.log(getFileName("./date.js", 2))//.js
// console.log(getFileName("./date.js", 3))//date

对称加密和解密

加密

//cipher加密算法
function cipher(str){
    try{
        const crypto = require('crypto');
        /**
         * --创建 Cipher 实例。 不能使用 new 关键字直接地创建 Cipher 对象
         * --crypto.createCipher,@param1 算法,@param2 密文,@param3 向量--可为""或省略
         */ 
        const cipher = crypto.createCipher('aes128', '冷月心');



        /**
         * update方法
         * @param1 加密的数据
         * @param2 数据编码格式,一般为utf8
         * @param3 输出格式,一般为 'base64' 或者 'hex',缺省返回Buffer
         */
        let encrypted = cipher.update(str, 'utf8', 'hex');

            /**
             * final方法,返回加密后结果
             * @param 返回值的字符编码 ,一般为 'base64' 或者 'hex',缺省返回Buffer
             * -- 一旦 cipher.final() 方法被调用, Cipher 对象就不能再用于加密数据。 
             * -- 如果试图再次调用 cipher.final(),将会抛出一个错误。
             */
            encrypted += cipher.final('hex');
        return encrypted;
    }catch(e){
        console.log('加密失败');

        return e.message ;
    } 
}

const result=cipher('清风明月晓星尘') ;

console.log(result)//fa0bb8ac7f40bfdc925bd24ae2aacc04ac89740c0bd6dfe51213d9e66a8e0360

解密

function decipher(encrypted){
    try{
        const crypto = require('crypto');
        const decipher = crypto.createDecipher('aes128', '冷月心')
        let decrypted = decipher.update(encrypted, 'hex', 'utf8');
            decrypted += decipher.final('utf8');
        return decrypted;
    }catch(e){
        console.log('解密失败');
        return e.message;
    }
}

const result=decipher('fa0bb8ac7f40bfdc925bd24ae2aacc04ac89740c0bd6dfe51213d9e66a8e0360'); 
console.log(result)//清风明月晓星尘

三种常用加密算法

var crypto = require("crypto");

//自己利用node自带的crypto模块封装出来的md5加密函数,传入初始密码,返回加密后密码
function my_md5(initPWD){
    var md5 = crypto.createHash('md5');//创建哈希加密算法,后边可以是md5,sha1,sha256等
    var password = md5.update(initPWD).digest('base64');//也可以用hex 
    return password;
}

//测试
console.log("加密前:123456");
console.log("加密后:"+my_md5(my_md5("123456")));

node基础教程_node_04md5双重加密
node基础教程_node_05sha1双重加密
node基础教程_node_06sha256双重加密