expressにて、reactに情報を渡すためのapi作りにチャレンジしています。
postmanで確認すると、json自体は帰っているのですが、
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
とエラーが出ています。
なぜこのようなエラーが出ていて、どのようにすればエラーが出ずにアプリがアプリがクラッシュしないのでしょうか。
big5db.js
js
1var express = require('express'); 2var router = express.Router(); 3 4const client = require('mongodb').MongoClient; 5const url = 'mongodb://localhost:27017'; 6 7client.connect(url, { useUnifiedTopology: true }, function (err, client) { 8 9 var db = client.db("test_db"); 10 var collection = db.collection("Big5"); 11 12 var query = {}; 13 var projection = { 14 "personality.name": "$personality.name", 15 "personality.percentile": "$personality.percentile", 16 "personality.trait_id": "$personality.trait_id", 17 "_id": 0 18 }; 19 20 var cursor = collection.find(query).project(projection); 21 22 23router.get('/',function(req,res,next){ 24 cursor.forEach( 25 function(doc) { 26 var data = doc.personality.map(({name, trait_id, percentile}) => ({name, trait_id, percentile})) 27 //res.render('big5db.ejs',{big5s: data}); 28 res.status(200).json(data); 29 }, 30 function(err) { 31 client.close(); 32 } 33 ); 34}); 35 36 37router.get('/big5_openness',(req,res,next)=>{ 38 cursor.forEach( 39 function(doc) { 40 var data = doc.personality[0].children.map(({name,percentile}) => ({name,percentile})) 41 return res.json(data); 42 } 43 ); 44 }); 45 46router.get('/big5_conscientiousness',(req,res,next)=>{ 47 cursor.forEach( 48 function(doc) { 49 var data = doc.personality[1].children.map(({name,percentile}) => ({name,percentile})) 50 return res.json(data); 51 } 52 ); 53 }); 54 55router.get('/big5_extraversion',(req,res,next)=>{ 56 cursor.forEach( 57 function(doc) { 58 var data = doc.personality[2].children.map(({name,percentile}) => ({name,percentile})) 59 return res.json(data); 60 } 61 ); 62 }); 63 64router.get('/big5_agreeableness',(req,res,next)=>{ 65 cursor.forEach( 66 function(doc) { 67 var data = doc.personality[3].children.map(({name,percentile}) => ({name,percentile})) 68 return res.json(data); 69 } 70 ); 71 }); 72 73router.get('/big5_neuroticism',(req,res,next)=>{ 74 cursor.forEach( 75 function(doc) { 76 var data = doc.personality[4].children.map(({name,percentile}) => ({name,percentile})) 77 return res.json(data); 78 } 79 ); 80 }); 81 82}); 83 84module.exports = router; 85
app.js
js
1var createError = require('http-errors'); 2var express = require('express'); 3var path = require('path'); 4var cookieParser = require('cookie-parser'); 5var logger = require('morgan'); 6 7var indexRouter = require('./routes/index'); 8var usersRouter = require('./routes/users'); 9var big5db = require('./routes/big5db'); 10var twitter = require('./routes/twitter'); 11 12var app = express(); 13 14// view engine setup 15app.set('views', path.join(__dirname, 'views')); 16app.set('view engine', 'ejs'); 17 18app.use(logger('dev')); 19app.use(express.json()); 20app.use(express.urlencoded({ extended: false })); 21app.use(cookieParser()); 22app.use(express.static(path.join(__dirname, 'public'))); 23 24app.use('/', indexRouter); 25app.use('/users', usersRouter); 26app.use('/twitter', twitter); 27app.use('/big5db', big5db); 28 29 30// catch 404 and forward to error handler 31app.use(function(req, res, next) { 32 next(createError(404)); 33}); 34 35// error handler 36app.use(function(err, req, res, next) { 37 // set locals, only providing error in development 38 res.locals.message = err.message; 39 res.locals.error = req.app.get('env') === 'development' ? err : {}; 40 41 // render the error page 42 res.status(err.status || 500); 43 res.render('error'); 44}); 45 46module.exports = app;
例えば、http://localhost:5001/big5db/にゲットリクエストを送ると、以上のようなエラーが出ます。
参考などを見たモノの、一つのパスにつき、resは一回だけにしているので、なぜこれでheaderを二回もセットしているよ、とエラーが出るのかわかりません。
基本的なこととは思いますが、ご教授いただけると幸いです。
また、express-generatorで雛形を構築しております。
それを使わないバージョンでも試したのですが、やはり同じ状況でした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/01 23:53