ねぎ嫌い

思いついたことをてきとうに。

S3からShift JISファイルを取り込んで処理をする(Node.js)

ちょっとハマって悔しかったので。

node.jsがShift_JISの変換をうまいことやってくれない。
変換様のパッケージをインストールする。

npm i iconv-lite npm i -D @types/iconv-lite

UTF-8であれば、以下のように楽に取り込める
なお、Typescript

import { S3 } from 'aws-sdk';

export const loadContent = async(bucket: string, path: string): Promise<string> => {
    const s3: S3 = new S3();
    const params: S3.GetObjectRequest = {
      Bucket: bucket,
      Key: path
    };
    const ret: S3.Types.GetObjectOutput = await s3.getObject(params).promise();
    return ret.Body.toString('utf-8');
}

今回はStream APIを使って、バイナリ形式でファイルを取込み、Shift_JISに変換した。

//... 略

    const stream = s3.getObject(params).createReadStream().pipe(iconv.decodeStream('Shift_JIS'));
    let content = '';
    stream.on('data', d => content += d);


    await new Promise(function(resolve, reject) {
      stream.on('end', () => resolve(stream.read()));
      stream.on('error', reject);
    });

    return content;
}

古き良き時代に生きる私はNode v8.10でしかLambdaを動かせないのでAsync Iteratorが使えない。
多分Async Iteratorが使えると、

    for await (const chunk of stream) {
      content += chunk;
    }

で書けそう。