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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

Q&A

解決済

1回答

611閲覧

node.js : エラーがどこにあるのかわからない

dwayne_johnson

総合スコア86

Node.js

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

1グッド

1クリップ

投稿2018/08/20 16:48

Fireabaseのcloud functionsで、node.jsを実行しています。

コードはいかの通りです。

const fs = require('fs'); const firebase = require('./firebase'); const storage = firebase.storage; const createArticleHtml = (snap, context) => { console.log("in createArticle Html"); console.log("snap is this : ", snap); const data = snap; const md_data_path = data.body; console.log("path is : ", md_data_path); getMdFileFromStorage(md_data_path) .then((md_data) => { return mdToHtml(md_data) }) // ここから処理が続く
const getMdFileFromStorage = (path) => { return new Promise((resolve, reject) => { console.log("in getMdFileFromStorage"); const file = storage.bucket().file(path); file.createReadStream() .on('error', (err) => { console.log("Error in getMdFileFromStorage"); reject(err); }) .on('response', (response) => { console.log("response : ", response); console.log("response.read() : ", response.read()); resolve(response); }) .on('end', () => { console.log("getMdFile is finished") }) }) }

以上を実行すると、処理が途中で詰まってしまいます。

FIreabse のコンソール上から確認すると、なぜか、console.logもエラーの記載もなく、処理が止まっていることが確認できます。

具体的には、console.log("in getMdFileFromStorage");が実行されるのを最後に、その先の処理がまったく続きません。
自分の想定としては、file.createReadStream()から先で、エラーなど際にも対応する処理を行っているため、エラーが起きた場合はそのことが何かしらわかるものと考えているのですが、何も表示されません。

なぜ処理が詰まっているのか、お分かりになる方いらっしゃいましたら、お力を貸してほしいです。

よろしくお願いいたします。

参考: cloud storageファイルのcreateReadStream

miyabi-sun👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそも何がしたいからgetMdFileFromStorageという関数を用意したのかよくわかりませんが、
createReadStreamはNode.jsのStreamという概念を利用するReadableStreamのインスタンスです。

Node.jsが用意しているStreamというのはその名の通り、川の流れという意味ですから、
exampleにあるように、最後にpipeメソッドを呼び出して別Streamに接続して運河を作らなければいけません。
そうすることで少しずつpipeで繋いだ別のStreamにデータが流れて行きます。
従ってnew Promise(fn)でStreamを包んでも役には立ちません。


しかし、このNode.jsのStreamはかなり難解な実装であり、
省メモリで高速なファイル操作を実現したいみたいな要望で仕方なく使うといった感じのもので、FirebaseがStreamしか用意していないとは思えません。

ではどうすればよかったか?
getMdFileFromStorageとあるように、Strageから何かのファイルを受け取りたかった…つまりダウンロードしたかったんじゃないでしょうか?
もしそうであればcreateReadStreamではなく、downloadメソッドを使うようにすれば解決すると思います。

downloadメソッドは質問者さんの意図通りPromiseのインスタンスを返すようですので少しの手直しで先に進めるんじゃないでしょうか。

投稿2018/08/21 01:07

miyabi-sun

総合スコア21158

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

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

dwayne_johnson

2018/08/21 02:10 編集

そうか! > Streamというのはその名の通り、川の流れ > 別Streamに接続して運河を作らなければいけません 質問をさせていただく前に、Stream APIについてはいろいろ調べており、データが細切れに読み込まれていくということはわかったのですが、それをどのような場合に使えばいいのかの認識がなかったです。 「 別Streamに接続して運河を作る」という例えが、大変役立ちました。writableStreamなどに繋げるために利用されると理解しました。 また、downloadメソッドですが、これも質問する前に試していたのですが、返ってくる内容が、`<Buffer 23 20 ...>`のようなものであったため、何かデータを読み込み中と勘違いし、これでは処理できないものと早とちりしてしまい、Stream に固執していました。 しかし、これは Buffer クラスのデータであり、中にはしっかりとデータが入っているということに気が付きました。それを`.toString`することで、データを文字列として取り出すことができ、次の処理に繋げることができました。 参考: https://mag.osdn.jp/13/04/09/193000 http://info-i.net/buffer-string#i-2 大変丁寧にご回答いただき、大変助かりました。 おかげ様で、いろいろと理解が深まりました。 ありがとうございました!
miyabi-sun

2018/08/21 03:13

> それを`.toString`することで、データを文字列として取り出すことができ b よいNode.jsライフを
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問