前提・実現したいこと
node.js + express.jsでjsonデータを返信するシステムを作成しています。
ブラウザ側で、XMLHttpRequestを使ってjsonデータを要求し、
サーバー側で、アクセスに応じてres.jsonでjsonデータを返しています。
ブラウザ側では、確認のために、受信したデータをinnerHTMLを使って表示させようとしています。
なお、テンプレートエンジンはEJSを使用しています。
発生している問題・エラーメッセージ
エラーメッセージは発生していないのですが、受信したデータがブラウザに表示されません。
XMLHttpRequest.statusを表示させると0になります。
一方で、
- ブラウザのアドレスバーに該当アドレス(http://127.0.0.1:3000/resdata)を直接打ち込むと、jsonデータが表示される。
- 下記index.ejsの<script>内部の日付表示やステータス表示のinnerHTMLは正しく表示される。
ので、XMLHttpRequestの使い方が間違っていると思っているのですが、解決策が分かりません。
ソースコード
####index.js
javascript
1let express = require('express'); 2let router = express.Router(); 3 4/* GET home page. */ 5router.get('/', (req, res, next) => { 6 res.render('index'); 7}); 8 9module.exports = router;
####index.ejs
html
1<!DOCTYPE html> 2<html> 3<head> 4 <meta http-equiv="content-type" content="text/html" ; charset="UTF-8"> 5 <title>sample data</title> 6 <link rel='stylesheet' href='/stylesheets/style.css'/> 7</head> 8<body> 9<p>sample data</p> 10<p id="date"></p> 11<p id="res_data"></p> 12<p id="status"></p> 13<p id="response"></p> 14</body> 15<script> 16 window.onload = () => { 17<!-- 日付データ表示 --> 18 let date = new Date(); 19 document.getElementById("date").innerHTML = date; 20 21 let xmlHttpRequest = new XMLHttpRequest(); 22 23 xmlHttpRequest.timeout = 1000; 24 xmlHttpRequest.responseType = 'json'; 25 26 xmlHttpRequest.open( 'GET', 'http://127.0.0.1:3000/resdata', true ); 27 28<!-- 受信データ表示 --> 29 xmlHttpRequest.loadend = () => 30 { 31 document.getElementById("res_data").innerHTML = xmlHttpRequest.responseText; 32 }; 33 34 xmlHttpRequest.send( null ); 35 36<!-- 確認データ(.status,.response)表示 --> 37 document.getElementById('status').innerHTML = xmlHttpRequest.status; 38 document.getElementById('response').innerHTML = xmlHttpRequest.response; 39 40 }; 41</script> 42</html> 43
####resdata.js
javascript
1let express = require('express'); 2let router = express.Router(); 3let mysql = require('mysql'); 4 5let knex = require('knex')({ 6 client: 'mysql', 7 connection: { 8 host: 'localhost', 9 user: '******', 10 password: '', 11 database: 'sample_data', 12 charset: 'utf8', 13 }, 14}); 15 16let Bookshelf = require('bookshelf')(knex); 17 18let Sample_data = Bookshelf.Model.extend({ 19 tableName: 'sample_data', 20}); 21 22/* GET home page. */ 23router.get('/', (req, res, next) => { 24 25 new Sample_data().orderBy('datetime', 'asc') 26 .fetchAll() 27 .then((collection) => { 28 let data = { 29 title: 'sample_data', 30 content: collection.toArray(), 31 }; 32 res.json(data); 33 }); 34}); 35 36module.exports = router; 37
試したこと
下記サイトや他のサイトも検索し、XMLHttpRequestの使用部分(index.ejsの<script>内部)で、
- xmlHttpRequest.loadendを.onloadにする。
- document.getElementById("res_data").innerHTML = xmlHttpRequest.responseText;の実行時に、this.readyState == 4 && this.status == 0の条件を追加
などを試しました。
補足情報(FW/ツールのバージョンなど)
OS:MacOS 10.14.6
IDE:WebStorm 2019.2.4
ブラウザ:google Chrome Version 78.0.3904.97
以上、よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/14 12:00
退会済みユーザー
2019/11/14 12:05
2019/11/15 04:34