質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

853閲覧

node.js、sequalize.jsでの同期処理

dousuruyo

総合スコア74

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2020/06/30 08:21

前提・実現したいこと

スプレッドシートにSQLから取得したデータをもとに加工して貼り付ける処理を作っていました

コードの中のconsole.log(JSON.stringify(setSagyo));の部分でログが出ないところと、出るところがあり、全部出る想定でした
同期処理に問題があるのかと思いいろいろと試してみましたが、ログ出力結果は「{}」と、一か所だけ正常にログが出る状態でした
setSagyoの中身をその下の処理でも使いたいのですが、どうすればよいでしょうか?

該当のソースコード

node.js

1const spread = require("./spread_common"); 2const SPREAD_PAGETATE_ID = "スプレッドシートのID"; 3 4const oAuth2Client = spread.oAuth2Client; //権限 5const sheets = spread.sheets; //シート 6const drive = spread.drive; //ドライブ 7const permissionId = spread.permissionId; //パーミッションID 8 9/** 10 * 帳票出力 11 * @param {*} model モデル 12 * @param {*} req リクエスト 13 * @param {*} res レスポンス 14 */ 15exports.outputPageTate = async function (model, req, res) { 16 const sequelize = model.sequelize; 17 18 // 対象のスプレッドシートをコピーを作成 19 let param_copy = { 20 supportsAllDrives: true, 21 fileId: SPREAD_PAGETATE_ID 22 } 23 const copy = await drive.files.copy(param_copy); 24 25 // 出力用パラメータ 26 const output = { 27 spreadsheetId: copy.data.id, 28 valueInputOption: "USER_ENTERED", 29 auth: oAuth2Client, 30 resource: { 31 data: [ 32 ] 33 } 34 }; 35 36 var sql = ` 37★SQLその1★ 38 `; 39 40 var sql_page = ` 41★SQLその2★ 42 `; 43 44 sequelize.query(sql, { replacements: req.body.params }).spread(async (records, metadata) => { 45 sequelize.query(sql_page, { replacements: req.body.params }).spread(async (records_page, metadata) => { 46 var ClientKey = req.body.params.ClientKey; 47 var LotCode = req.body.params.LotCode; 48 var flg = req.body.params.flg; 49 var record = records[0]; 50 var title = (flg == 'Honsatu') ? record['Title'] : '小冊 ' + record['Title']; 51 var pagesu = Math.floor((records_page.length - 31) / 60) + 1; 52 53 // 文集合本形式、当社作業、納品手配 54 var setSagyo = await setPageTateTyouhyou_Sagyo(sequelize, req, model); 55 56 // 部品一覧、トビラ 57 var setBuhin = setPageTateTyouhyou_Parts(sequelize, req, model); 58 59 // 表裏見返し 60 var setMikaesi = setPageTateTyouhyou_Mikaesi(sequelize, req); 61 62 // 備考 63 var setMemo = setPageTateTyouhyou_Memo(record); 64 65 // 頁リスト 66 var setPage = setPageTateTyouhyou_Page(sequelize, req); 67 68 console.log(JSON.stringify(setSagyo)); //ここではsetsagyoの中身が出ません 69 }); 70 }); 71} 72 73 74/** 75 * 文集合本形式、当社作業、納品手配 76 * @param {*} req 77 * @param {*} model 78 */ 79async function setPageTateTyouhyou_Sagyo(sequelize, req, model) { 80 var setSagyo = {}; 81 var sql = ` 82★SQL★ 83 `; 84 85 sequelize.query(sql, { replacements: req.body.params }).spread(async (records, metadata) => { 86 var records_code = await model.M_CodeMaster.findAll({ where: { CodeNo: 16 } }); 87 88 89 var record = records[0]; 90 91 setSagyo['BunsyuKeisiki'] = record.BuhinSonzaiBasyo; 92 setSagyo['NouhinTehai'] = record.CodeTi; 93 setSagyo['TousyaSagyou1'] = null; 94 setSagyo['TousyaSagyou2'] = null; 95 setSagyo['TousyaSagyou3'] = null; 96 setSagyo['TousyaSagyou4'] = null; 97 for (i = 0; i < records_code.length; i++) { 98 if (record.TousyaSagyou != null) { 99 if (record.TousyaSagyou.match(/1/) && records_code[i].CodeID == 1) { 100 setSagyo['TousyaSagyou1'] = records_code[i].CodeTi; 101 } else if (record.TousyaSagyou.match(/2/) && records_code[i].CodeID == 2) { 102 setSagyo['TousyaSagyou2'] = records_code[i].CodeTi; 103 } else if (record.TousyaSagyou.match(/3/) && records_code[i].CodeID == 3) { 104 setSagyo['TousyaSagyou3'] = records_code[i].CodeTi; 105 } else if (record.TousyaSagyou.match(/4/) && records_code[i].CodeID == 4) { 106 setSagyo['TousyaSagyou4'] = records_code[i].CodeTi; 107 } 108 } 109 } 110 111 112 console.log(JSON.stringify(setSagyo)); //ここではsetsagyoの中身が出ます 113 return Promise.resolve(setSagyo); 114 }); 115 116console.log(JSON.stringify(setSagyo)); //ここではsetsagyoの中身が出ません 117 return setSagyo; 118} 119 120/** 121 * 部品一覧、トビラ 122 * @param {*} req 123 * @param {*} model 124 */ 125async function setPageTateTyouhyou_Parts(sequelize, req, model) { 126127} 128 129/** 130 * 表裏見返し 131 * @param {*} req 132 */ 133async function setPageTateTyouhyou_Mikaesi(sequelize, req) { 134135} 136 137/** 138 * 備考 139 * @param {*} record 140 */ 141async function setPageTateTyouhyou_Memo(record) { 142143} 144 145/** 146 * 頁リスト1ページ目 147 * @param {*} req 148 */ 149async function setPageTateTyouhyou_Page(sequelize, req) { 150151}

試したこと

async/await,promiseなどの同期処理に問題があると考えていろいろ試したが駄目でした。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

上記sequalize部分を

node.js

1return new Promise((resolve, reject) => { 2 sequelize.query(sql, { replacements: req.body.params }).spread(async (records, metadata) => { 3 var records_code = await model.M_CodeMaster.findAll({ where: { CodeNo: 16 } }); 4 5 6 var record = records[0]; 7 8 setSagyo['BunsyuKeisiki'] = record.BuhinSonzaiBasyo; 9 setSagyo['NouhinTehai'] = record.CodeTi; 10 setSagyo['TousyaSagyou1'] = null; 11 setSagyo['TousyaSagyou2'] = null; 12 setSagyo['TousyaSagyou3'] = null; 13 setSagyo['TousyaSagyou4'] = null; 14 for (i = 0; i < records_code.length; i++) { 15 if (record.TousyaSagyou != null) { 16 if (record.TousyaSagyou.match(/1/) && records_code[i].CodeID == 1) { 17 setSagyo['TousyaSagyou1'] = records_code[i].CodeTi; 18 } else if (record.TousyaSagyou.match(/2/) && records_code[i].CodeID == 2) { 19 setSagyo['TousyaSagyou2'] = records_code[i].CodeTi; 20 } else if (record.TousyaSagyou.match(/3/) && records_code[i].CodeID == 3) { 21 setSagyo['TousyaSagyou3'] = records_code[i].CodeTi; 22 } else if (record.TousyaSagyou.match(/4/) && records_code[i].CodeID == 4) { 23 setSagyo['TousyaSagyou4'] = records_code[i].CodeTi; 24 } 25 } 26 } 27 resolve(); 28 }); 29})

とnew Promiseで囲って記載することで意図通り(クエリの結果をreturnして呼び出し側で受け取る)の処理を続行することができました

投稿2020/07/01 01:25

編集2020/07/01 01:26
dousuruyo

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問