1、node目录查找
Glob Pattern匹配模式:glob patterns是一种匹配模式,运用通配符(wildcard characters)来匹配一个文件列表(sets of filenames)。像在shell里面,用*等匹配模式来匹配文件。

glob库:基于Javascript实现,使用minimatch库进行匹配。
主要方法:
glob(pattern, [options], cb) // Perform an asynchronous glob search.
glob.sync(pattern, [options]) // Perform a synchronous glob search.

var glob = require("glob")

glob("**/*.js", options, function (err, files) {
 // files is an array of filenames.
})

glob.sync('./src/views/**/main.js').forEach(function(filename) {
    let basename = path.basename(filename, path.extname(filename))
    let tmp = entry.split('/').splice(3)
    tmp.pop()
    let pathname = tmp.join('/')
    entries[pathname] = filename
});

2、node文件操作

const fs = require('fs');
const path = require('path');

/**
 * 评估npm项目所依赖的最低node版本
 * 通过读取npm项目node_modules目录,获取所有npm包package.json中说明依赖的最低node版本
 */
function analyzeNodeVersions() {
    const context = path.join(process.cwd(), 'node_modules') // npm项目node_modules目录绝对路径
    const dirs = fs.readdirSync(context); // 读取文件夹下所有目录
    // 读取所有npm包目录下 package.json 文件,获取npm包依赖的最低node版本
    let arr = []  
    dirs.forEach(dir => {
        const file = `${context}/${dir}/package.json`
        if (fs.existsSync(file)) {
            arr.push(file) // 收集所有目录下package.json文件绝对路径
            var data = fs.readFileSync(file);
            if (data) {
                data = JSON.parse(data)
                if (data.engines && data.engines.node) {
                    fs.appendFileSync('res.txt', file + '\n' + data.engines.node + '\n')
                }
            }
        }
    })
    console.log(arr)
}

analyzeNodeVersions() // 在npm项目根目录执行函数

3、node实现登录

/**
 * 登录系统
 * @param {String} username 用户名
 * @param {String} password 密码
 */
async function login(username, password) {
    const res = await fetch(`${BASE_URL}/websys/xxx/login.do`, {
        credentials: 'include',
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Referer': ' http://xxx.com.cn/websys/xxx/index.html'
        },
        body: qs.stringify({
            name: username,
            pwd: password
        })
    })
    const matchArr = res.headers.get('set-cookie').match(new RegExp('sys_auth?=([^;]+)'));
    const sys_auth = matchArr && matchArr[1];

    if (!sys_auth) {
        throw new Error('登录错误,请确认用户名或密码是否正确');
    }

    cookie = `SITE=alm01; ws_auth=${ws_auth};` // 全局保存登录token
}

/**
 * 依据登录token请求后续接口
 */
async function getPlans(planId) {
    return await fetch(`${BASE_URL}/websys/xxx/${planId}/plan/?planList`, {
            credentials: 'include',
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                'Cookie': cookie
            },
            body: qs.stringify({
                pageSize: 10,
                pageNo: 5,
            })
        })
        .then(res => res.json())
        .then(data => data.plans.rows);
}

4、node获取空闲端口
网络参考文章

findPort.js:

const Promise = require('bluebird')
let net = require('net')

function range(from, to) {
  let items = []
  for (let i = from; i <= to; ++i) {
    items.push(i)
  }
  return items
}
let scanPorts = range(9527, 9600)

function getFreePort(){
    return new Promise((resolve, reject)=>{
    if (scanPorts.length === 0) {
        console.log('分配端口已达最大限额')
        return resolve(null)
    }
    let port = scanPorts.shift()
    let server = net.createServer().listen(port) //创建服务进程绑定指定端口
    server.on('listening',function() {
      server.close() //服务器停止接收新的连接,保持现有连接
      resolve(port)
    })
    
    server.on('error',function(err){
      // Error: Address In Use
      if(err.code == 'EADDRINUSE') { 
        getFreePort()
      }
    })
  })
}

module.exports = {
  getFreePort: getFreePort
}

5、node操作excel文件


JohnsonGH
32 声望1 粉丝