いくつかのs3オブジェクトを取得してデータベースにインポートするためにこのスクリプトを書いたので、これをローカルdbに対して実行すると、そこにあるはずのすべての3265レコードがインポートされます。 AWS Postgresのインスタンスに対して実行すると、ちょっとした方法でハングアップして正常終了し、約50ほどのレコードしかインポートできません。私はそれが何らかのタイムアウトだったと思ったが、その効果を得ることができなかった。また、カスタムprocess.exitも無視します。私もPostgresのインスタンスログを調べてみましたが、そこには何も出ていませんでした。私は少し迷っています。ノードの繊細さや、このコードを書いたやり方を見逃しているかもしれません。なぜこの特定のコードは、ローカルDBではなくリモートdbに対して実行されている途中で終了するのですか?
const { NODE_ENV } = process.env
import config from '../config'
config()
import AWS from 'aws-sdk';
import db from './db/sequelize/models/db_connection'
process.on('uncaughtException', function (exception, p) {
console.log(p)
console.log(exception);
});
class FailedImport extends Error {
constructor(message) {
Error.captureStackTrace(this, this.constructor);
this.name = this.constructor.name;
this.message = message;
}
}
var s3 = new AWS.S3()
async function listObjects() {
return await s3.listObjects({Bucket: process.env.S3_BUCKET_NAME}).promise()
}
function importData(objectList) {
return objectList.Contents.map(async (obj) => {
try {
let data = await s3.getObject({ Bucket: process.env.S3_BUCKET_NAME, Key: obj.Key}).promise()
let body = data.Body
let dataLines = body.toString().split('\n')
return Promise.all(dataLines.map(async (line) => {
try {
let jsonifiedLine = JSON.parse(line)
return await db.Site.upsert({ url: jsonifiedLine['api_url'], quantcast_rank: 0})
} catch(e) {
console.error(e)
}
}))
}
catch(err) {
console.log(err)
}
})
}
export function runImport() {
listObjects().then((objects) => {
return Promise.all(importData(objects))
.then(() => console.log('Finished import.'))
.catch((err) => console.log(err))
}).catch((err) => {
console.log(err)
throw new FailedImport(err)
})
}
runImport()