9.nodejs内蔵モジュール
70331 ワード
nodejs内蔵モジュール
ファイル操作
nodejsでは、ファイルを操作するためにfsモジュールを提供します.nodejsでは、操作ファイルは同期と非同期の方式を提供していますが、実際の開発では、非同期を使って開発することが多いです.ファイルの書き込み ファイルの追加 通常の書き込みは、カバー効果です.コンテンツを追加したいなら、使えます.ファイルの読み込み ファイルのコピー ファイル情報を取得する fsモジュールのstat方法によって、一つのファイルの具体的な情報が得られます. isFile:ファイルかどうか判断する isDirectory:ディレクトリかどうか判断する ファイルを削除する ディレクトリ を作成します.ディレクトリ を読みだします.
ここで再帰的に使用する必要があります.まず、現在の項目がファイルかどうかを判断します.ファイルであれば、プリントアウトし、ディレクトリが再帰的にディレクトリに入り続けるなら、判断します.
注意:カタログにファイルがあれば、システムは削除を許可しません.つまり、空のディレクトリを削除するしかないです.だからここでまた再帰を使います.
nodejsではhttpという内蔵モジュールを提供しています.このモジュールを使って、ウェブサーバーを素早く構築できます.
get要求
中国語に再変換したいなら、decodeURIという方法が使えます.
httpモジュールを使って簡単な爬虫類を実現します.
爬虫類とは、ウェブページを登るためのものです.
nodejsではhttpとhttpsモジュールを使って簡単な爬虫類を実現できます.モジュール、cherioモジュールに使用されます.このモジュールは、返された文字列をjQueryのドルオブジェクトに変換することができ、jQueryの様々な方法を使用することができます.
ここでは、Buffer、Streamファイルフローに関連します.
Buffer
一番早い時は、jsはブラウザの中で運行しています.つまり、jsはクライアントで運行しています.だから、その時は、jsは文字列しか操作できません.nodeの出現に従って、jsはサーバー端の開発をすることができて、だからバイナリデータを操作する需要があって、Bufferは私達にバイナリデータを操作させることができます.
私たちは簡単にBufferに関する方法を紹介します.
Bufferは相当してメモリの中でしばらくの空間を開発しました.私たちプログラマはこのメモリの大きさを手動で指定することができます.
流れの概念
流れとは、水の流れのようなものです.例えば、私たちはオンラインで映画を見たり、映画をダウンロードしたりします.映画という資源はあっという間にクライアントに届くのではなく、流れの形で少しずつ来たのです.ここでは実は流れの概念に触れています.
理想的な方式は一部を読んで、一部を書いて、ファイルがどれだけ大きいかに関わらず、時間の許す限り、いつも処理し終わります.
nodejsでは、この流れを操作することができます.
モジュール名はstreamで、いくつかの一般的なイベントを提供しています. data:データ読み出し時にトリガ end:より多くのデータが読み取り可能でない場合、 をトリガする. error:エラーが発生したら、 をトリガします. finish:すべてのデータが下に書き込まれると がトリガされます.
streamでは、一般的な流れは2つあります. readable:読み取り可能なストリーム writable:書き込み可能ストリーム 前にfsモジュールを勉強しましたが、fsではファイルを読み込むアプリはreadFileです.しかし、このアプリは実はnodejsが一回封入されました.実はファイルを読み込む下の階はまだフローの操作で読み取ります.次に、ファイルをストリーム形式で読みます.
書き込み可能ストリームによってファイルをコピーします.
pipe法を使うと、大きなファイルを扱う時、効率が高くなります.二つのストリームファイルの間にパイプを作ったのと同じです.
次にpipe方法を使って上記のファイル操作のステップを簡略化します.
ウェブ開発をする時、サーバー側がクライアントにデータを返します.このデータは圧縮が必要です.
(1)ブラウザ側が圧縮ファイルを受け付けているかを明確にする
ブラウザがhttp要求を送信する時、要求ヘッドの中にキーがあります.Acceept-Encocdingは、このブラウザが受信できるコードフォーマットを表しています.もし中にgzipが含まれていたら、このブラウザが圧縮ファイルを受信できると説明しています.
(2)nodejsの中でどのようにファイルを圧縮しますか?
nodejsの中の一つの内蔵モジュールzlibを使います.
実際の開発では、まずユーザーのブラウザが圧縮ファイルをサポートしているかどうかを判断する必要があります.
ファイル操作
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
})
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 }
ファイルの情報の対象を取ったら、上にいくつかの方法があります.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で、いくつかの一般的なイベントを提供しています.
streamでは、一般的な流れは2つあります.
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);