Node.js のスニペット集

このページは、Node.js のスニペットなどをまとめる予定のページです。

目次

注意

  • コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。
  • await がついているコードは async 関数内で実施してください。((async () => { })() 内など)

スニペット

Buffer

Buffer の結合

const bufferArray = [];
bufferArray.push(Buffer.from('あ'));
bufferArray.push(Buffer.from('い'));
bufferArray.push(Buffer.from('う'));
const buffer = Buffer.concat(bufferArray); // <Buffer e3 81 82 e3 81 84 e3 81 86>

テキストファイル読み込み

fs promises (12 以上)
// const fs = require('fs').promises;
const data = await fs.readFile('file.txt', 'utf8');
const lines = data.split(/\r?\n/);
promisify
// const { promisify } = require('util');
// const fs = require('fs');
const data = await promisify(fs.readFile)('file.txt', 'utf8');
const lines = data.split(/\r?\n/);

テキストファイル書き込み

fs promises (12 以上)
// const fs = require('fs').promises;
await fs.writeFile('file.txt', 'x');
promisify
// const { promisify } = require('util');
// const fs = require('fs');
await promisify(fs.writeFile)('file.txt', 'x');
// const fs = require('fs');
const st = fs.createWriteStream('file.txt');
st.write("test\r\n");
st.close();

CSV 読み込み

UTF-8 の CSV ファイルの読み込み (readFile)
// const fs = require('fs').promises;
const data = await fs.readFile('data.csv', 'utf8');
const records = parse(data, { skip_empty_lines: true });
for (const record of records) {
    console.log(record);
}
Shift_JIS (CP932) の CSV ファイルの読み込み (steram)
// const _fs = require('fs');
// const parse = require('csv-parse'); // npm install csv-parse
// const iconv = require('iconv-lite'); // npm install iconv-lite
const parser = parse({ skip_empty_lines: true });
const rs = _fs.createReadStream('data.csv');
rs.pipe(iconv.decodeStream('cp932')).pipe(parser);
for await (const record of parser) {
    console.log(record);
}
Shift_JIS (CP932) の CSV ファイルの読み込み (readFile)
// const _fs = require('fs');
// const parse = require('csv-parse/lib/sync'); // npm install csv-parse
// const iconv = require('iconv-lite'); // npm install iconv-lite
const buffer = await fs.readFile('data.csv');
const data = iconv.decode(buffer, 'cp932');
const records = parse(data, { skip_empty_lines: true });
for (const record of records) {
    console.log(record);
}

ファイル名取得

// const path = require('path');
const filename = path.basename('/path/to/file.txt');

ディレクトリ作成 (存在しない場合のみ)

fs promises (12 以上)
// const _fs = require('fs');
// const fs = require('fs').promises;
const dir = 'path/to/dir';
if (_fs.existsSync(dir)) {
    fs.mkdir(dir, { recursive: true });
}
promisify
// const { promisify } = require('util');
// const fs = require('fs');
const dir = 'path/to/dir';
if (fs.existsSync(dir)) {
    promisify(fs.mkdir)(dir, { recursive: true });
}
  • fs.exists() は Deprecated ですが fs.existsSync() はそうでないため fs.existsSync() を使用します。

コマンド実行

// const { promisify } = require('util');
// const child_process = require('child_process');
// const exec = promisify(child_process.exec);
const { stdout, stderr } = await exec('echo 1');
console.log(stdout, stderr);

インターネット上の画像ファイルの保存

request を使用する場合
// const _fs = require('fs');
// const request = require('request');
request('http://example.com/test.png').pipe(_fs.createWriteStream('test.png'));
axios を使用する場合
// const _fs = require('fs');
// const axios = require('axios');
axios({
    url: 'http://example.com/test.png',
    responseType: 'stream'
}).then((response) => response.data.pipe(_fs.createWriteStream('test.png')));
axios を使用する場合 (+ await)
// const _fs = require('fs');
// const axios = require('axios'); // npm install axios
const response = await axios({
    url: 'https://knooto.info/img/logo.png',
    responseType: 'stream'
});
response.data.pipe(_fs.createWriteStream('test.png'));

ユーティリティ関数

指定時間待つ

/**
 * 指定時間待ちます。
 * @param {number} ms ミリ秒
 */
async function sleep(ms){ return new Promise(resolve => setTimeout(resolve, ms)); }

// await sleep(1000);

ファイル・ディレクトリパス一覧取得

/**
 * ファイル・ディレクトリのパス一覧を取得します。(例: listFiles('/path/to/dir'), listFiles('/path/to/dir', { recursive: true }))
 * @param {string} baseDir 起点になるディレクトリパス
 * @param {object} options オプション (recursive: サブディレクトリのファイルも取得するか。デフォルト false)
 * @return {Promise<string[]>} ファイル・ディレクトリのパス一覧
 */
async function listFiles(baseDir, options) {
    // const { promisify } = require('util');
    // const fs = require('fs');

    const { recursive = false } = options || {};
    let result = [];
    let list = await promisify(fs.readdir)(baseDir);
    for (let f of list) {
        const p = path.join(baseDir, f);
        const st = await promisify(fs.stat)(p);
        if (st.isDirectory()) {
            result.push(p);

            if (recursive) {
                const subFiles = await listFiles(p, options);
                result.push(...subFiles);
            }
        }
        else {
            result.push(p);
        }
    }
    return result;
}