ちょっとハマって悔しかったので。
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; }
で書けそう。