web-dev-qa-db-ja.com

Promisesを使用した複数のSequelizeJSモデルクエリメソッドの実行-Node

Sequelizejsを使用してデータベースからデータを取得する際に問題が発生しました。 NODEJSは初めてです。 PromiseとPromise.allが関数に組み込まれているかどうかわからないので、コードにもnpmpromiseをインストールして必要とします。以下は私のコードです。

var Promise = require('promise');

var user_profile = new Promise(function(resolve, reject) {
    db.user_profile.findOne({
        where: {
            profile_id: new_profile_id
        }
    }).then(user => {
        console.log('Summary Result User found.');
        resolve(user);
    });
});

var all_reports = new Promise(function(resolve, reject) {
    db.report.all().then(reports => {
        console.log('Summary Result Reports found.');
        resolve(reports);
    });
});

var report_details = new Promise(function(resolve, reject) {
    db.report_detail.findAll({
        where: {
            profile_id: new_profile_id
        }
    }).then(report_details => {
        console.log('Summary Result Report Details found');
        resolve(report_details);
    });
});

var all_promises = Promise.all([user_profile, all_reports, report_details]).then(function(data) {
    console.log('**********COMPLETE RESULT****************');
    console.log(data);
}).catch(err => {
    console.log('**********ERROR RESULT****************');
    console.log(err);
});

3つのクエリすべてのデータを取得したいと思います。それらを個別に実行するとデータが取得されますが、Promise.allで実行すると、user_profileデータのみが取得され、他の2つは残りますndefinedこれらのクエリを.thenでネストしようとしましたが、結果は同じですクエリデータを1つだけ取得し、他の2つは残りますndefined

チェーンを使用

var results = [];
var new_profile_id = req.params.profile_id;
console.log(new_profile_id);
db.user_profile.findOne({
    where: {
        profile_id: new_profile_id
    }
}).then(user => {
    console.log('Summary Result User found.');
    results.Push(user.dataValues);
    return user;
}).then(user => {
    db.report.all().then(reports => {
        console.log('Summary Result Reports found.');
        results.Push(reports.dataValues);
        return reports
    });
}).then(reports => {
    db.report_detail.findAll({
        where: {
            profile_id: new_profile_id
        }
    }).then(report_details => {
        console.log('Summary Result Report Details found');
        results.Push(report_details.dataValues);
        console.log('**********COMPLETE RESULT****************');
        console.log(results);
        console.log('**********COMPLETE RESULT****************');
        return report_details;
    });
});

誰かが私が間違っていることをこの概念で私を助けてくれますか?ありがとう

6
Danial

Node.jsの最新バージョンは、すでにPromiseをネイティブにサポートしているため、Sequelizeもサポートしています。これは、promiseを個別に要求する必要がないことを意味します。

次のコードはあなたのものに基づいています。

_const user_profile = db.user_profile.findOne({
    where: {
        profile_id: new_profile_id
    }
});

const all_reports = db.report.all();

const report_details = db.report_detail.findAll({
    where: {
        profile_id: new_profile_id
    }
});

Promise
    .all([user_profile, all_reports, report_details])
    .then(responses => {
        console.log('**********COMPLETE RESULTS****************');
        console.log(responses[0]); // user profile
        console.log(responses[1]); // all reports
        console.log(responses[2]); // report details
    })
    .catch(err => {
        console.log('**********ERROR RESULT****************');
        console.log(err);
    });
_

Sequelizeはすでにpromiseを返すため、Sequelize呼び出しをPromiseでラップする必要がないことに注意してください。このようにすれば、最後のPromise.all()catchが1つだけ必要です。これはすべての呼び出しで欠落していました。これが意味するのは、いずれかの呼び出しが失敗した場合、対応するresolveが呼び出されることはないということです。つまり、最後のPromise.all()も呼び出されないということです。これが、カスタムエラー処理要件がない限り、最後にすべてのエラーを一度に処理するのが良い理由です。

12
Eye