実現したいこと
fetchに特化したjsファイルからexportしたJsonの値をrouter.jsに送って、resでview側に渡したい。。
/* fetch.js */ const Quiz = require('./class'); const fetch = require('node-fetch'); const apiAddress = 'https://opentdb.com/api.php?amount=10'; const f = fetch(apiAddress, { method: 'get', }); const f2 = f.then(res => Promise.resolve(res.json())) .then(json => { quizArray = []; for (let i=0; i<=9; i++) { const quiz = new Quiz(); const quizCount = quiz.getQuizArray(i, json); quizArray.push(quizCount); } const quizJson = JSON.stringify(quizArray); return quizJson; }) .catch(err => console.error(err)) module.exports = f2;
/* router.js */ const express = require('express'); const router = express.Router(); const api = require('../fetch'); console.log('api:'+ api); //api:[object Promise] router.get('/', function(req, res, next) { res.render('index', { question: api[0]['quetion']//ここでjsonの配列を指定したい }); }); module.exports = router;
やってみたこと
Promiseについて理解が乏しいのですが、fetch.js
のfetchのメソッドをasync/awaitの非同期関数化してreturn quizJson
取得まで待つ動作を書けばよいと思われます。しかし、どう書けばよいかまで理解が進んでいません。
【追加】
色々検索した結果、似通っている質問を見つけました。
ここ
これのExpress版が大雑把に言って私の質問になると思います。
この質問の回答にあるように現実的には難しいのではあれば、fetchしたデータをrouterを通じてどうやってview側(ejs)に渡せばよいのでしょうか?
宜しくおねがいします。
Markdown流儀のリンクの貼り方は`[タイトル](URL)`です。
今回の例ですと
[teratail-【JavaScript】fetchで取得したデータを変数にセットして自由に使いたい](https://teratail.com/questions/286024)
これでぐっと見栄えが良くなると思いますので編集してみてくださいね。
ご依頼ありがとう。しかし、うまく反映しません、プレビューでは正しいリンクを付けますが・・・
あー、ごくまれに上手く反映されないバグみたいなのありますね。
私が経験した時は、もう一度編集すれば動いた記憶があります。
編集してみましたが、同じのようです。
やっぱりうまくいきませんね。このままにしておきますw
回答1件
あなたの回答
tips
プレビュー