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

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

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

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

1643閲覧

Express 4.x のstream処理の方法について

退会済みユーザー

退会済みユーザー

総合スコア0

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

1クリップ

投稿2017/11/22 06:59

MongoDBからデータを取得して、表示させる簡単なシステムですが、練習のため取り組んでいます。
toArrayではうまくデータベースの値を表示させることができるのですが、streamを使用した際に、

Error: Can't set headers after they are sent. at validateHeader (_http_outgoing.js:494:11) at ServerResponse.setHeader (_http_outgoing.js:501:3) at ServerResponse.header (/home/vagrant/blog/node_modules/express/lib/response.js:767:10) at ServerResponse.contentType (/home/vagrant/blog/node_modules/express/lib/response.js:595:15) at ServerResponse.send (/home/vagrant/blog/node_modules/express/lib/response.js:145:14) at done (/home/vagrant/blog/node_modules/express/lib/response.js:1004:10) at tryHandleCache (/home/vagrant/blog/node_modules/ejs/lib/ejs.js:228:10) at View.exports.renderFile [as engine] (/home/vagrant/blog/node_modules/ejs/lib/ejs.js:437:10) at View.render (/home/vagrant/blog/node_modules/express/lib/view.js:135:8) at tryRender (/home/vagrant/blog/node_modules/express/lib/application.js:640:10)

上記のエラーが発生してしまいます。

Javascript

1var MongoClient = require('mongodb').MongoClient; 2var posts = [{title:'name' , body:'body'}]; 3exports.index = function(req,res){ 4 MongoClient.connect("mongodb://localhost/posts", function(err, db) { 5 if (err) { return console.dir(err); } 6 console.log("connected to db"); 7 //このstream処理がエラーを発生させています。 8 var stream = db.collection('post').find({}).stream(); 9 stream.on('data',function(docs){ 10 db.close(); 11 res.render('posts/index.ejs',{items:docs}); 12 }); 13 14 /*下記のtoArrayであれば呼び出せます。 15 db.collection("post", function(err, collection) { 16 collection.find({}).toArray(function(err,docs){ 17 db.close(); 18 res.render('posts/index.ejs',{items:docs}); 19 }); 20 }); 21*/ 22}); 23}; 24

コメントで書いてある通りなのですが、toArrayでは問題なく出力できるのに対し、streamでは先述した通りのエラーが発生します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

toArrayでは一度にデータを受け取れますが、
streamのdataイベントでは複数回に分けて少しずつ受け取ることもあります。

複数回dataイベントが発生したとすると、2回目のrenderがエラーになると思います。
1回目のrenderでレスポンスデータを送り終わったはずなので、またレスポンスのヘッダー情報等はセットできないというエラーです。

EJSのテンプレートにデータを設定する目的ならば、データを一度に受け取れるtoArrayの方が扱いやすいでしょう。

投稿2017/11/22 07:57

shimitei

総合スコア799

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

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

退会済みユーザー

退会済みユーザー

2017/11/22 08:02

ご回答ありがとうございます。 大量のデータを捌くならstreamと聞いたもので何も考えずに使用しようとしていました。 toArrayでデータを出力しようと思います。ご教授いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問