前提・実現したいこと
javascriptでTwitter管理システムを作っています。
投稿の機能を実装中に以下の問題が発生しました
発生している問題・エラーメッセージ
scheduledPost関数ないの全ての処理が終わってから、returnで結果を返したいが、処理が終わる前に、returnが実行されている。原因は、「executionCheckedProcessingsData.forEach」の部分だと考えています。
呼び出した関数から { success: [], fail: [ '22時08分' ], error: [] } error 19時22分 [ { code: 187, message: 'Status is a duplicate.' } ] error 22時15分 [ { code: 187, message: 'Status is a duplicate.' } ] error 19時40分 [ { code: 187, message: 'Status is a duplicate.' } ] error 19時11分 [ { code: 187, message: 'Status is a duplicate.' } ] error 19時30分 [ { code: 187, message: 'Status is a duplicate.' } ] error 22時05分 [ { code: 187, message: 'Status is a duplicate.' } ] error 00時00分 [ { code: 187, message: 'Status is a duplicate.' } ] error 22時16分 [ { code: 187, message: 'Status is a duplicate.' } ]
該当のソースコード
scheduledPost.js
js
1const scheduledPost = async (req) => { 2 // 【質問】外部モジュールのimportは、自作関数の中に書くか、外に書くか?(2021/03/23) 3 const tweet = require("../mainFunctions/tweet"); 4 const executionCheck = require("./executionCheck"); 5 6 const executionCheckedProcessingsData = await executionCheck(req); 7 8 const result = { 9 success: [], 10 fail: [], 11 error: [], 12 }; 13 14 executionCheckedProcessingsData.forEach(async (data) => { 15 if (data.execution) { 16 await tweet(data.tweet) 17 .then(() => { 18 console.log("success", data.processingName); 19 result.success.push(data.processingName); 20 }) 21 .catch((error) => { 22 console.log("error", data.processingName, error); 23 result.error.push(data.processingName, error); 24 }); 25 } else { 26 result.fail.push(data.processingName); 27 } 28 }); 29 return result; 30}; 31 32scheduledPost("hoge").then((result) => { 33 console.log("呼び出した関数から", result); 34}); 35 36module.exports = scheduledPost; 37
tweet.js
js
1const Twitter = require("twitter"); 2const oAuth = require("../keys/authKeys.json"); 3 4const tweet = async (postContent) => { 5 const client = new Twitter(oAuth); 6 7 const result = await client.post("statuses/update", { status: postContent }); 8 9 return result; 10}; 11 12module.exports = tweet; 13
executionCheck.js
js
1const executionCheck = async (req) => { 2 const getJapanTime = require("../otherFunctions/getJapanTime"); 3 const fetchProcessingsData = require("../mainFunctions/fetchProcessingsData"); 4 5 const JapanTime = getJapanTime(); 6 const processingsData = await fetchProcessingsData(); 7 8 const executionCheckedProcessingsData = await processingsData.map((data) => { 9 if (req) { 10 data["execution"] = data.switch === "ON"; 11 return data; 12 } else { 13 data["execution"] = data.switch === "ON" && data.startTime === JapanTime; 14 return data; 15 } 16 }); 17 18 return executionCheckedProcessingsData; 19}; 20 21module.exports = executionCheck; 22
試したこと
・非同期処理の問題だと思い、aysnc/awaitやthenメソッドなどを使ってみましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
node.js v12
twitter 1.7.1
回答2件
あなたの回答
tips
プレビュー