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;
});
});
誰かが私が間違っていることをこの概念で私を助けてくれますか?ありがとう
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()
も呼び出されないということです。これが、カスタムエラー処理要件がない限り、最後にすべてのエラーを一度に処理するのが良い理由です。