9.nodejs内蔵モジュール

70331 ワード

nodejs内蔵モジュール
ファイル操作
nodejsでは、ファイルを操作するためにfsモジュールを提供します.nodejsでは、操作ファイルは同期と非同期の方式を提供していますが、実際の開発では、非同期を使って開発することが多いです.
  • ファイルの書き込み
  • fs.writeFile()
    
    以下は具体的な例である.
    const fs = require('fs');
    console.log('start');
    fs.writeFile('./test.txt','this is a test',function(err){
         
        if(err) throw err;
        console.log('is writing!');
    })
    console.log('end');
    
  • ファイルの追加
  • 通常の書き込みは、カバー効果です.コンテンツを追加したいなら、使えます.
    fs.appendFile()
    
    具体的な例は以下の通りである.
    const fs = require('fs');
    console.log('start');
    fs.appendFile('./test.txt','this is a test',function(err){
         
        if(err) throw err;
        console.log('is writing!');
    })
    console.log('end');
    
  • ファイルの読み込み
  • fs.readFile()
    
    具体例は以下の通りです.
    const fs = require('fs');
    console.log('start');
    fs.readFile('./test.txt',function(err,data){
         
        if(err) throw err;
        console.log(data.toString());
    })
    console.log('end');
    
  • ファイルのコピー
  • fs.copyFile()
    
    具体例は以下の通りです.
    const fs = require('fs');
    fs.copyFile('./test.txt','./test5.txt',(err)=>{
         
        if(err) throw err
    })
    
  • ファイル情報を取得する
  • fsモジュールのstat方法によって、一つのファイルの具体的な情報が得られます.
    const fs = require('fs');
    fs.stat('./test.txt',(err, status)=>{
         
        if(err) throw err;
        console.log(status);
    });
    // Stats {
         
    //     dev: 16777222,
    //     mode: 33188,
    //     nlink: 1,
    //     uid: 501,
    //     gid: 20,
    //     rdev: 0,
    //     blksize: 4096,
    //     ino: 12908241066,
    //     size: 17,
    //     blocks: 8,
    //     atimeMs: 1600244238410.9111,
    //     mtimeMs: 1600242358742.662,
    //     ctimeMs: 1600244237825.9692,
    //     birthtimeMs: 1600237795491.121,
    //     atime: 2020-09-16T08:17:18.411Z,
    //     mtime: 2020-09-16T07:45:58.743Z,
    //     ctime: 2020-09-16T08:17:17.826Z,
    //     birthtime: 2020-09-16T06:29:55.491Z }
    
    ファイルの情報の対象を取ったら、上にいくつかの方法があります.
  • isFile:ファイルかどうか判断する
  • isDirectory:ディレクトリかどうか判断する
  • ファイルを削除する
  • fs.unlink()
    
    具体的な使用例は以下の通りです.
    const fs = require('fs');
    fs.unlink('./test.txt',(err)=>{
         
        if(err) throw err;
        console.log('delete OK!');
    })
    
    操作ディレクトリ
  • ディレクトリ
  • を作成します.
    fs.mkdir
    
    具体例は以下の通りです.
    const fs = require('fs');
    fs.mkdir('./yaoyao',(err)=>{
         
        if(err) throw err;
        console.log('created!');
    })
    
  • ディレクトリ
  • を読みだします.
    fs.readdir()
    
    具体例は以下の通りです.
    const fs = require('fs');
    fs.readdir('./',(err,files)=>{
         
        if(err) throw err;
        console.log(files);
    })
    // [ '.DS_Store',
    //   'index.js',
    //   'node_modules',
    //   'package-lock.json',
    //   'package.json',
    //   'test2.txt',
    //   'test3.txt',
    //   'test5.txt',
    //   'yaoyao' ]
    
    どのようにしてディレクトリ内のすべてのファイルを読みますか?
    ここで再帰的に使用する必要があります.まず、現在の項目がファイルかどうかを判断します.ファイルであれば、プリントアウトし、ディレクトリが再帰的にディレクトリに入り続けるなら、判断します.
    const fs = require('fs');
    const path = require('path'); // nodejs        ,        
    const showFile = function(dir){
         
        //      ,   fs.readdir          
        fs.readdir(dir,(err,files)=>{
         
            if(err) throw err;
            files.forEach(file=>{
         
                //               
                let filedir = path.join(dir,file);
                fs.stat(filedir,(err,stat)=>{
         
                    if(err) throw err;
                    if(stat.isFile()){
         
                        //       if,     ,        
                        console.log(file);
                    } else {
         
                        //      
                        showFile(filedir);
                    }
                })
            })
        })
    }
    showFile('./yaoyao');
    
    耀耀ちゃんが提供する方法:
    const fs = require('fs');
    
    function readdirFn(str) {
         
        fs.readdir(str, {
         
            withFileTypes: true
        }, (err, data) => {
         
            if (err) throw err;
            for (let index in data) {
         
                if(!data[index].isFile()){
         
                    readdirFn(str+data[index].name+'/')
                }else{
         
                    console.log(data[index].name);
                }
            }
        })
    }
    readdirFn('./yaoyao/')
    
    作業:ディレクトリを削除します.
    注意:カタログにファイルがあれば、システムは削除を許可しません.つまり、空のディレクトリを削除するしかないです.だからここでまた再帰を使います.
    //      
    const fs = require('fs')
    const path = require('path')
    function delDir(dir) {
         
        fs.readdir(dir, (err, files) => {
         
            //          
            if (files) {
         
                files.forEach(file => {
         
                    let filedir = path.join(dir, file); //        
                    //        ,       
                    fs.stat(filedir, (err, status) => {
         
                        //           ,            
                        if (status && status.isDirectory()) {
         
                            delDir(filedir);
                        } else {
         
                            fs.unlink(filedir, err => {
          });
                        }
                    });
                });
            }
            //    if  ,        ,      
            fs.rmdir(dir, err => {
         
                if (fs.existsSync(dir)) {
         
                    delDir(dir);
                }
            });
        });
    }
    delDir("./yaoyao");
    
    //     
    const fs = require('fs');
    const path = require('path');
    const delDir = (dir) => {
         
        //         
        if (fs.existsSync(dir)) {
         
            //             ,        
            const files = fs.readdirSync(dir);
            //      ,     ,    ;     ,     
            files.forEach(function (file, index) {
         
                const curPath = path.join(dir, file); //       
                if (fs.statSync(curPath).isDirectory()) {
         
                    delDir(curPath); //      ,        
                } else {
         
                    fs.unlinkSync(curPath); //     
                }
            });
            //        ,             ,       
            fs.rmdirSync(dir);
        }
    }
    delDir('./test');
    
    httpモジュール
    nodejsではhttpという内蔵モジュールを提供しています.このモジュールを使って、ウェブサーバーを素早く構築できます.
    const http = require('http');
    http.createServer((req,res)=>{
         
        // req    http   ,res      
        res.writeHead(200, {
         'Content-type' : 'text/html;charset=utf-8'}); //              
        res.write('

    Hello,Nodejs

    '
    ); res.end('

    nodejs

    '
    ); // }).listen(3000); console.log(' ...');
    上記の例を通して、私達は速やかにサーバーを構築しました.次に、getとpost要求のデータをどのように取得するかを検討する必要がある.
    get要求
    const http = require('http');
    const url = require('url'); // node     
    http.createServer((req,res)=>{
         
        // req    http   ,res      
        res.writeHead(200, {
         'Content-type' : 'text/html;charset=utf-8'}); //              
        const params = url.parse(req.url,true).query;
        console.log(params);
        res.write('

    Hello,Nodejs

    '
    ); res.end('

    nodejs

    '
    ); // }).listen(3000); console.log(' ...');
    ポスト要請
    const http = require('http');
    const url = require('url'); // node     
    
    let str = `
    
    
    
        
        
        Document
    
    
        
    `
    ; http.createServer((req,res)=>{ let body = ''; // post // data req.on('data',function(chunk){ body += chunk; }); // end post req.on('end',function(){ console.log(body); res.writeHead(200,{ 'Content-Type' : 'text/html;charset=utf-8'}); if(body){ res.end(' post :' + body); } else { res.end(str); } }) }).listen(3000); console.log(' ...');
    中国語を転送する時、ブラウザは自動的に中国語をエンコードします.サーバーで取得した中国語はトランスコードしたものです.
    中国語に再変換したいなら、decodeURIという方法が使えます.
    httpモジュールを使って簡単な爬虫類を実現します.
    爬虫類とは、ウェブページを登るためのものです.
    nodejsではhttpとhttpsモジュールを使って簡単な爬虫類を実現できます.モジュール、cherioモジュールに使用されます.このモジュールは、返された文字列をjQueryのドルオブジェクトに変換することができ、jQueryの様々な方法を使用することができます.
    const https = require('https');
    const cheerio = require('cheerio');
    
    //         ,       http   ,       
    //           ,         
    
    https.get('https://tuijian.hao123.com/hotrank',(req)=>{
         
        let data = ''; //       
        req.on('data',(chunk)=>{
         
            data += chunk
        });
        req.on('end',()=>{
         
            filter(data);
        })
    })
    
    function filter(data){
         
        let result = []; //         
        const $ = cheerio.load(data); //         cheerio   ,      jQuery   ,             jQuery   
        const temp_arr = $('[monkey="ss"]').find('.point-bd').find('.point-title')
        temp_arr.each((index,item)=>{
         
            result.push($(item).text());
        })
        console.log(result);
    }
    
    データIO操作関連モジュール
    ここでは、Buffer、Streamファイルフローに関連します.
    Buffer
    一番早い時は、jsはブラウザの中で運行しています.つまり、jsはクライアントで運行しています.だから、その時は、jsは文字列しか操作できません.nodeの出現に従って、jsはサーバー端の開発をすることができて、だからバイナリデータを操作する需要があって、Bufferは私達にバイナリデータを操作させることができます.
    私たちは簡単にBufferに関する方法を紹介します.
    Bufferは相当してメモリの中でしばらくの空間を開発しました.私たちプログラマはこのメモリの大きさを手動で指定することができます.
    let buf1 = new Buffer.alloc(5);
    console.log(buf1); // 
    
    ブザーにデータを書き込みます.
    let buf1 = new Buffer.alloc(5);
    buf1.write('a');
    console.log(buf1);
    
    もう一つのバグの例を見てください.
    let buf = new Buffer.alloc(26);
    for(let i=0;i<26;i++){
         
        buf[i] = i + 97;
    }
    console.log(buf.toString());
    
    Streamファイルフロー
    流れの概念
    流れとは、水の流れのようなものです.例えば、私たちはオンラインで映画を見たり、映画をダウンロードしたりします.映画という資源はあっという間にクライアントに届くのではなく、流れの形で少しずつ来たのです.ここでは実は流れの概念に触れています.
    理想的な方式は一部を読んで、一部を書いて、ファイルがどれだけ大きいかに関わらず、時間の許す限り、いつも処理し終わります.
    nodejsでは、この流れを操作することができます.
    モジュール名はstreamで、いくつかの一般的なイベントを提供しています.
  • data:データ読み出し時にトリガ
  • end:より多くのデータが読み取り可能でない場合、
  • をトリガする.
  • error:エラーが発生したら、
  • をトリガします.
  • finish:すべてのデータが下に書き込まれると
  • がトリガされます.
    streamでは、一般的な流れは2つあります.
  • readable:読み取り可能なストリーム
  • writable:書き込み可能ストリーム
  • 前にfsモジュールを勉強しましたが、fsではファイルを読み込むアプリはreadFileです.しかし、このアプリは実はnodejsが一回封入されました.実はファイルを読み込む下の階はまだフローの操作で読み取ります.次に、ファイルをストリーム形式で読みます.
    const fs = require('fs');
    //        
    const rs = fs.createReadStream('./test.txt');
    rs.setEncoding('utf8');
    rs.on('data',(chunk)=>{
         
        console.log(chunk);
        console.log('-----------------------------');
    })
    
    書き込み可能ストリーム
    書き込み可能ストリームによってファイルをコピーします.
    const fs = require('fs');
    //        
    const rs = fs.createReadStream('./test.txt');
    //        
    const ws = fs.createWriteStream('./test2.txt');
    rs.setEncoding('utf8');
    rs.on('data',(chunk)=>{
         
        ws.write(chunk);
    })
    rs.on('end',()=>{
         
        console.log('    !');
    })
    
    pipe法を使ってストリームを処理します.
    pipe法を使うと、大きなファイルを扱う時、効率が高くなります.二つのストリームファイルの間にパイプを作ったのと同じです.
    次にpipe方法を使って上記のファイル操作のステップを簡略化します.
    const fs = require('fs');
    //        
    const rs = fs.createReadStream('./test.txt');
    //        
    const ws = fs.createWriteStream('./test3.txt');
    rs.setEncoding('utf8');
    rs.pipe(ws);
    
    リソース圧縮
    ウェブ開発をする時、サーバー側がクライアントにデータを返します.このデータは圧縮が必要です.
    (1)ブラウザ側が圧縮ファイルを受け付けているかを明確にする
    ブラウザがhttp要求を送信する時、要求ヘッドの中にキーがあります.Acceept-Encocdingは、このブラウザが受信できるコードフォーマットを表しています.もし中にgzipが含まれていたら、このブラウザが圧縮ファイルを受信できると説明しています.
    (2)nodejsの中でどのようにファイルを圧縮しますか?
    nodejsの中の一つの内蔵モジュールzlibを使います.
    const fs = require('fs');
    const zlib = require('zlib');
    
    //            ,          
    const gzip = zlib.createGzip();
    const rs = fs.createReadStream('./test.txt'); //         
    const ws = fs.createWriteStream('./test.txt.gz'); //         
    
    rs.pipe(gzip).pipe(ws);
    
    解凍とは圧縮の逆操作です.
    const zlib = require('zlib');
    
    //            ,          
    const gunzip = zlib.createGunzip();
    const rs = fs.createReadStream('./test.txt.gz');
    const ws = fs.createWriteStream('./test10.txt');
    
    rs.pipe(gunzip).pipe(ws);
    
    (3)実用化
    実際の開発では、まずユーザーのブラウザが圧縮ファイルをサポートしているかどうかを判断する必要があります.
    const fs = require('fs');
    const zlib = require('zlib');
    const http = require('http');
    
    const filePath = './index2.html'; //                
    
    http.createServer((req,res)=>{
         
        //    accept-encoding   
        const acceptEncoding = req.headers['accept-encoding'];
        if(acceptEncoding.indexOf('gzip')!=-1){
         
            //    if,     gzip   ,    ,    
            res.writeHead(200,{
         'Content-type':'gzip'})
            const gzip = zlib.createGzip();
            fs.createReadStream(filePath).pipe(gzip).pipe(res);
        } else {
         
            //      
            fs.createReadStream(filePath).pipe(res);
        }
    }).listen(3000);