【node.js】サーバサイドjavascript 5【Nashorn】

1デフォルトの名無しさん
垢版 |
2018/02/13(火) 22:21:33.91ID:moEhrPrC
pythonやrubyやPHPと同じ土俵でjavascriptが使えるようになりました。
サーバサイドjavascriptについて語りましょう。

node.js - googleが開発したV8エンジン上で実行できる処理系
http://nodejs.org/
ayo.js - node.js 互換で Rod の影響からの脱却を目指す処理系
https://github.com/ayojs/ayo
Nashorn - Java8 からRhinoに代わって同梱されているJavaScriptエンジン
http://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JA17-Nashorn.pdf

ayo.js の経緯
https://web.archive.org/web/20170821212745/https://github.com/nodejs/TSC/issues/310
javascriptはrubyと比較してもかなり速い
http://shootout.alioth.debian.org/u32/benchmark.php?test=all&;lang=v8&lang2=yarv
基礎から学ぶNode.js
http://gihyo.jp/dev/serial/01/nodejs
node.jsの概要とアプリケーション開発の準備
http://gihyo.jp/dev/serial/01/realtimeweb/0002

前スレ
【node.js】サーバサイドjavascript 4【io.js】
http://mevius.5ch.net/test/read.cgi/tech/1460359714/
【node.js】サーバサイドjavascript 3【io.js】
http://echo.2ch.net/test/read.cgi/tech/1419673207/
【node.js】サーバサイドjavascript 2【Rhino】
http://peace.2ch.net/test/read.cgi/tech/1358937029/
【node.js】サーバサイドjavascript【Rhino】
http://toro.2ch.net/test/read.cgi/tech/1310087535/
457デフォルトの名無しさん
垢版 |
2020/08/11(火) 00:54:04.11ID:jdRsH5YI
これまでの非同期対策手段の
やって欲しかったのはこういうことじゃないんだよ感
がやばい
本来求めてるのはコールバックの記述ないようにして
欲しいのと 余計な関数定義無しで処理を書きたいということ
なのに

Promiseやasync awaitがやってるのは
非同期処理をネストしなくて良くするだけで
肝心のコールバック記述や
余計な関数定義自体はなくならず、
それどころかこれらを使うと更にコードが複雑に
なって可読性が下がってしまう。
そういうゴチャゴチャした部分を無くして欲しいんだよ。
2020/08/11(火) 02:13:08.66ID:DrUL4lPZ
>>457
具体的に理想系を書いてくれるか?
2020/08/11(火) 06:51:02.02ID:KjgiWsfP
WScript.sleep(1000);
2020/08/11(火) 09:44:42.63ID:DyHWpKfR
>>458
ボンッキュッボンッ!
2020/08/11(火) 12:08:29.63ID:HwJhgroD
互換性ぶっ壊してでもコールバックなAPIをどうにかしてくれ
ってことならDenoじゃね
2020/08/11(火) 12:31:29.28ID:RcrtMjNU
>>457はコールバックだけじゃなくてPromiseも否定してね?
どういうものを期待してるのかわからんが、少なくともdenoじゃ解決にならんかと。
2020/08/11(火) 13:28:07.94ID:gDej+7HY
ならGoだろうな
コールバックも非同期処理もいらない
さようなら
2020/08/11(火) 13:50:34.02ID:OsUriXGV
どうせメッセージパッシングに文句垂れるな決まってる
2020/08/11(火) 13:51:16.33ID:OsUriXGV
s/垂れるな/垂れるに/
466デフォルトの名無しさん
垢版 |
2020/08/11(火) 15:38:26.65ID:jdRsH5YI
>>458
ごめんちょっとコールバック入っちゃったけど
こんな感じがいい
「await」という単語は他に思い浮かばなかったから
真似しただけで別の単語でもなんでもいい
実際の「await」の処理とは無関係


await setTimeout( ()=>{}, 1000);
console.log('1秒経過しました');


コールバック引数が欲しい場合
ver data = await $.ajax({省略}).done();
console.log('レスポンスを受信しました');
console.log(data);
467デフォルトの名無しさん
垢版 |
2020/08/11(火) 15:42:24.62ID:jdRsH5YI
↑varをverと書いてしまいました。
2020/08/11(火) 15:50:28.89ID:RcrtMjNU
結局Promise化すれば解決する話に見えるが
中途半端なコールバックの存在が謎。
2020/08/11(火) 16:25:16.36ID:E31y9T9f
Promiseとasync/awaitで解決済みだよなぁ

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))

って用意するなりimportするなりしておけば

await sleep(1000);
console.log('1秒経過しました');

これだけやんけ
$.ajaxとか書いちゃう知恵遅れさんだからしょうがないか
2020/08/11(火) 17:12:35.72ID:dI29r3/p
あんまりPromiseの事わかってなくて批判しちゃった感じかな。
2020/08/11(火) 17:34:48.50ID:DrUL4lPZ
>>467
スコープないのかよ
ゴミくそ
2020/08/11(火) 19:26:37.90ID:HwJhgroD
数行のコードじゃ意図が読み取り辛いけど
非同期関数を同期にしたいってコトなら絶対無理
2020/08/11(火) 19:33:26.30ID:GZz3NG8W
非同期関数を同期関数のように呼び出せるのがasync/awaitだけどな
動作の話じゃなくてソースの見た目の話だろどうせ
そんなこと気にするよりlet/const覚える方が先だぞ
2020/08/12(水) 07:56:55.71ID:XuneBSJh
promiseもasync/awaitも何も分かってないけど批判してたということだけは非常によく分かった
475デフォルトの名無しさん
垢版 |
2020/08/14(金) 21:41:29.39ID:Fc7pCCli
どうでもいいけど
独自の概念や用語をバンバン押し付けてくる
フレームワークは
ゲロ以下の匂いがプンプンするぜぇーって思うわ
PHP系の糞フレームワークに多い
2020/08/14(金) 21:47:18.13ID:970Aew80
>>475
逆に、独自の概念や用語を押し付けてこないフレームワークって例えば何?
2020/08/14(金) 21:50:10.65ID:B7DyCr2o
アセンブラ
478デフォルトの名無しさん
垢版 |
2020/08/14(金) 21:53:03.39ID:Fc7pCCli
>>476
やっぱexpressかな?
ララベルとかyiiとかは
ファサードとかDIコンテナとか
ゴミみたいな余計な用語出てきて腹立たしいわ
2020/08/14(金) 21:56:59.15ID:970Aew80
>>478
ファサードもDIコンテナも、フレームワーク独自の用語じゃなくてごくごく初歩的な一般用語では?
480デフォルトの名無しさん
垢版 |
2020/08/14(金) 22:07:25.07ID:Fc7pCCli
>>479
そうだね。webとは関係ないよね
webとは関係ない設計上の概念を
Webフレームーワークが押し付けてくるのはおかしいよね
フレームワークはルーティングと
HTMLレンダだけやってりゃいい
DBにもビジネスロジックにも出しゃばってくるべきでは無い
とくにJavaをパクってるだけのPHPでそんな内容
吐き気がするに決まってるだろ
2020/08/14(金) 22:24:17.70ID:B01JOFDh
DIは、最初はめんどくさい仕組みだなって思うけど、
ある日突然納得感に包まれるぞ。
482デフォルトの名無しさん
垢版 |
2020/08/18(火) 21:29:27.81ID:ZCkQ8Dn9
MySQLとかのDBアクセス
同期的にやってくれるライブラリないんか?
fsはSync版あるやん
2020/08/18(火) 21:50:58.81ID:uzsO+4Q7
async/await使えばいいやろ
fsのsyncなんてお遊びかツールでしか使えんし
2020/08/18(火) 21:58:10.75ID:wak8Bz4V
もうjavascriptだけで出来ないことはない!
javascript最強!
javascript最高!

今、javascriptの伝説が始まる!!!!!!
485デフォルトの名無しさん
垢版 |
2020/08/19(水) 04:18:53.44ID:vidjSvBe
キッショ
486デフォルトの名無しさん
垢版 |
2020/08/20(木) 19:53:59.17ID:KMfIHaw0
真偽値が非同期になるとヤバイ
trueかfalseのどちらかかと
思っていた変数が
pendingになっててif文の分岐に
ミスがあったとかマジで勘弁

セキュリティやトランザクション処理が
クリティカルな部分でこんなことやられたら叶わん
2020/08/20(木) 20:05:16.58ID:t5R+TL7j
ごめんよく分からないので
コードで頼む
2020/08/20(木) 20:09:16.66ID:AoU9HO21
低脳はプログラマやめとけ
2020/08/20(木) 20:16:29.65ID:X1nNk3cj
>>486
それマルチスレッドの話じゃね?「非同期」つってもjavascriptのそれとは意味が違う。
2020/08/20(木) 20:32:39.56ID:tyNv301J
pendingは普通にPromiseの話やろ

Promiseを理解せず非同期のコード書くのが悪い
491デフォルトの名無しさん
垢版 |
2020/08/20(木) 20:41:23.02ID:qjxJt4Hn
>>489
node.jsのスレだからJavaScriptの話なんだが
nodeってシングルスレで合ってる?

あと素人で申し訳ないが
if文がある時もそれ以降のコードに勝手に進んじゃうの?

たとえば
if(非同期の真偽値メソッド() ){
return;
}

console.log('ifに該当したら逐次処理ならここには到達しないはず');

逐次処理ならelseなしで処理を抜けることが出来るが、
非同期処理だと条件分岐も待ってくれないの?
こういうのがかなり怖い
492デフォルトの名無しさん
垢版 |
2020/08/20(木) 20:44:17.20ID:qjxJt4Hn
>>490
非同期のコードが書くの悪いって僕も書きたくないです。
でもデフォルトで非同期の関数ばかりですよね?
ちょっとでも油断すると非同期になっちゃうんです
もちろんasyncやawaitつけてるけど
ついつけ忘れるといつの間にか非同期になってるんです。
2020/08/20(木) 20:49:28.75ID:AoU9HO21
await付け忘れるヤツが悪い
TypeScriptで型チェックしとけ
2020/08/20(木) 21:17:24.78ID:t5R+TL7j
>>491
if(await hoge())するだけ
何も難しいことない
495デフォルトの名無しさん
垢版 |
2020/08/20(木) 22:05:57.37ID:wmqy4S/J
まぁそこは同期が基本から非同期が基本に頭切り替えないとね
2020/08/20(木) 22:43:19.84ID:tyNv301J
>>491
nodeに限らずJSは基本シングルスレッド

JSで本格的にコード書くなら
シングルスレッドでどうやって非同期や並行処理を実現してるのかを
最低限の知識として知っておく必要がある

setTimeout(fn, 0)で渡したfnがどのタイミングで実行されるのかと同じ
少し詳しめのチュートリアルならだいだい解説してある
497デフォルトの名無しさん
垢版 |
2020/08/21(金) 00:43:07.71ID:CMx879FZ
とは言え今ではスレッドも使えるから上手く利用したいところ。
シングルスレッドにこだわってコールバックの中で時間のかかる処理しちゃったら本末転倒。
2020/08/21(金) 01:18:26.76ID:RmDQK783
プロセスも使えるぞ。
せっかくだからV8 isolateも使いたいけどどうやるんだっけ…
2020/08/21(金) 01:47:45.18ID:fPne1yUC
workerが別スレッドのisolate
500デフォルトの名無しさん
垢版 |
2020/09/01(火) 20:38:22.47ID:QR4OvP6I
nodeはバッチ処理にはマジで向いてないよな
ループ中に非同期発生すると
ループ番号の順序性があべこべになるとか
ヤバすぎる
ループ外グローバル変数への
数値溜め込み処理とかどうなるんだこれ

あと完了したと思ってた処理が
完了表示されただけで
実はまだ非同期で動作してたとかありそうで
怖すぎる
2020/09/01(火) 20:42:12.06ID:I2eVqLbl
無能w
502デフォルトの名無しさん
垢版 |
2020/09/01(火) 20:43:25.87ID:tH3NhyKR
>>500
アホ過ぎるwww
2020/09/01(火) 20:58:34.78ID:z4ASdXsC
>ループ中に非同期発生すると

まるで自然現象とか天災みたいな言い方
504デフォルトの名無しさん
垢版 |
2020/09/01(火) 21:12:04.15ID:QR4OvP6I
すまん、俺は無能なんだわ
バッチ処理は終わるまで時間がかかるから
プログレスバーとして
進捗報告として
データベースの進捗状況テーブルへ
進行度をアップデートしてんだわ
毎ループ進捗報告しなくていいから
%で余り算して定期的に
進捗をアップデートしてんだわ
ところがその進捗報告DBアクセスで
非同期が発生してループの順序が乱れる
進捗状況の進行度が進んだり戻ったり
トリッキーに変動するんだわ
でもループの最後まで到達して完了すると
全てのデータ整合してんだわw
なぜ中間状態だけこんなにトリッキーなのか謎
2020/09/01(火) 21:24:55.53ID:I2eVqLbl
コード書くのやめろ
2020/09/01(火) 21:59:23.78ID:usFRsaVF
進捗の書き込みはシリアルにやればいいよね?
「80%完了」の後に「70%完了」が来ても無視すればいい
507デフォルトの名無しさん
垢版 |
2020/09/01(火) 22:02:04.20ID:QR4OvP6I
>>506
無視するようにしてるんだよ
whereで大小比較して
更新する数の方が小さかったら更新されないように
してる
でもDB上の数値が減るんだよ。何故だ?
2020/09/01(火) 22:05:22.51ID:3AXmEbq5
コードも無しで言われても知らんわ
2020/09/01(火) 22:28:22.77ID:usFRsaVF
>>507
シリアルに書いてないからでしょ
今実行中の進捗報告の書き込みが完了してから
次の進捗報告の書き込みをする

理解できないほうが謎
2020/09/02(水) 02:59:56.27ID:bHRnrATQ
7月入ってからageながら変なこと書いてんの同じ人っぽいな
挫けないでがんばれよ
2020/09/02(水) 12:32:41.24ID:U40YU3HI
並列処理しなければ良い

1つが、確実に終わってから、
次のものを処理する
2020/09/02(水) 13:19:02.32ID:FrAP3fk+
回答者まで同じ内容を繰り返し始めたw
513デフォルトの名無しさん
垢版 |
2020/09/02(水) 21:31:48.71ID:C0O9Iab7
>>504
こうなる原因が今日特定出来た
ループ自体が多重に並列に動作してた
1つのfor文が動いてるんだと思ってたら
ログをよくよく見たらfor文自体が
3つくらい並列で動いてた
勝手に多重実行になった原因は、
MySQLが処理しきれなくなってタイムアウトが
発生したあと
nodeが自動で(promiseの仕様?)最初から
リクエストの処理をリトライするようで
ピタゴラスイッチのアルゴリズム体操見たいに
なってたわw

初歩的な質問ですが
サーバに飛んできたリクエストだけを中断するには
exitが正解ですか?
returnが正解ですか?
res.end(); ですか?
サーバ自体は止めたくありませんが
ある関数自体を中断するだけでなく
そのリクエストだけ大元から全部中断したいです
2020/09/02(水) 22:07:44.16ID:m9UvO5Rn
お前がコード書くのをやめる、が正解
2020/09/07(月) 13:52:39.16ID:KQEAaFWf
どなたか、次の JS のコードの結果が、2,5,3 ではなく、2,3,5 になっている理由を説明出来ますか?

console.log( "0" );
var sample = new Promise( function(resolve, reject) {
  console.log( "1" );
  setTimeout(function() {
    console.log( "2" );
    resolve();
    console.log( "3" );
  }, 1000);
});
console.log( "4" );
sample.then( function(value) {
  console.log( "5" );
});
console.log( "6" );

[結果]
0
1
4
6
2
3
5
2020/09/07(月) 14:38:17.12ID:UUesL9I9
説明できますかって何だよ挑発してんのかよ
resolve()は必ずイベントループに戻ってからthen()のコールバックが呼ばれるからに決まってるだろがボケカス
マイクロタスクキューでも調べやがれポンコツ
517デフォルトの名無しさん
垢版 |
2020/09/07(月) 15:25:12.91ID:Egt+Qwmp
0
4
1
6
2
3
5

とか

0
4
6
1
2
3
5

にならない?
2020/09/07(月) 15:45:30.49ID:UUesL9I9
ならない
Promiseコンストラクタはコールバックを即時実行する

MDN
executor 関数は Promise 実装により resolve 関数と reject 関数が渡されて即座に実行されます (Promise コンストラクターが作成したオブジェクトを返すよりも前に executor は呼び出されます)。
2020/09/07(月) 17:09:51.23ID:3uGG3SyO
>>515
コールスタックが空にならないと、各種キューに入ってる処理は実行されない

最初にconsole.log(“6”);まで処理したらスタックが空になる
その状態でsetTimeoutのタイマーが発動してキューにコールバック関数が入る
スタックが空なのでキューの1番目にあるsetTimeoutのコールバック関数がスタックに積まれて呼び出される
この関数がreturnするまではスタックは空にならないので
それまではキューに入った処理を実行するタイミングはない

console.log(“3”);まで実行してreturnしたらスタックが空になるので
その後、各種キューに入ってる処理があれば実行される
2020/09/07(月) 17:21:12.28ID:KQEAaFWf
試してみたんですが、setTimeout()で指定している関数の中で、
resolve(111);
resolve(222);
resolve(333);
としてから、
sample.then( function(value) {
  console.log( "5, value=", value );
});
とすると、
5, value = 111
とだけ表示されて、222, 333 の分は表示されないんですが、どういった
理由なのでしょう。
521デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:33:56.06ID:Egt+Qwmp
お前はもう死んでいる
2020/09/07(月) 17:39:40.90ID:UUesL9I9
最初にresolve()した時点でそのPromiseの値は確定するから
つかスレに書き込む暇があるならドキュメントでも何でもいいから学習してPromiseがどういうもんか理解してから試せよ
Promiseってのは「将来確定する"値"」を表現するもんなんだよ
2020/09/07(月) 17:52:24.52ID:neZOTIA1
一旦解決したPromiseを再度変更出来たらそれは改竄と呼ぶべきだな
reject(111);
resolve(222);
reject(333);
これは成功したのか失敗したのかどっちよ?
2020/09/07(月) 18:07:19.89ID:ieMFgaPK
これ近頃よく見る相手にしちゃダメなやつだな
2020/09/07(月) 18:08:35.44ID:UUesL9I9
最初のreject()で失敗が確定する
Promiseの状態はpending→settledと変わる
settledにはfulfilledとfailedがある
resolve()でfulfilled、reject()でfailedになる
526デフォルトの名無しさん
垢版 |
2020/09/08(火) 00:01:18.48ID:8muSUg7S
nodeの非同期を同期的にやりたい時のコードって
promise async await
resolve thenが複雑に入り組んで
意図した動きになった時はめっちゃ過剰なコードになるよね
精神的にヘトヘトに疲れて 清書する元気も起きん
promiseやresolve変数がたくさん生成しまくって
名前つけるのもめんどうになって
p1とかr3みたいなのが沢山できてる
特にforループの中に非同期使うときは地獄

早くmysqlを同期的にクエリ投げられる
ライブラリ出してください。何でもしますから。
2020/09/08(火) 01:45:13.23ID:1Wq/gxeB
だからお前はプログラマやめろって
才能なさすぎ
2020/09/08(火) 02:32:28.50ID:o0Kum352
>>526
nodeも非同期も関係なくお前がめっちゃ過剰なコード書いてるだけだからな
2020/09/08(火) 12:00:40.54ID:gglleEZ2
ライブラリは需要があればとっくに作られてる
今現在無いのはつまりそういうことだ
2020/09/08(火) 12:14:59.78ID:1sQ8nqM1
そこの無能が探してもいないだけで無いわけじゃないだろ
例えばあるライブラリのREADMEから

const conn = await mysql.createConnection({ database: test });
const [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]);
await conn.end();

トランザクションも

await connection.beginTransaction();

await connection.commit();

と書ける
531デフォルトの名無しさん
垢版 |
2020/09/08(火) 13:42:27.36ID:8muSUg7S
select文を投げるのは
selectの結果が欲しいから投げる訳であって
結果が取得できる前に
後続のコードに勝手に動かれたら困るのは
当たり前だよなあ?
DBアクセスで非同期って何がメリットが
あるのか分からない。

それにnodeの概念はバカの新人に言葉で説明しにくいんだよ
あいつぜってー非同期とか理解出来ねえぞ
2020/09/08(火) 13:47:44.03ID:op+kwVtr
新人に言葉で説明できないバカ
新人かわいそう
2020/09/08(火) 13:57:56.32ID:c4WmASUK
> 勝手に動かれたら

何も理解してないことがよく分かるw
2020/09/08(火) 14:51:08.13ID:QV2EnsJl
お前の場合はMySQL一つしか使わないのが当たり前かもしれないが世の中にはシャードされた複数のMySQLにアクセスしたりキャッシュのRedisにアクセスしたり検索エンジンのelasticsearchにアクセスしたりいろんなことをしなきゃいけないアプリがあったりするわけ
Nodeではこれらは非同期だから特別なことをしなくてもたやすく並行アクセスできる
同期で並行アクセスしようとすると複数スレッド使って待ち合わせすることになるから非同期より簡単にできるわけではない
535デフォルトの名無しさん
垢版 |
2020/09/08(火) 16:00:24.51ID:8muSUg7S
>>534
ああ、アクセスするのは簡単やと思うわ
問題はその結果の始末を付けるのが大変だと思うわ
なんかいい書籍あるか?
2020/09/08(火) 17:40:30.89ID:Qj0BclxS
本当に本当にダメなヤツだなぁ(呆れ)
アクセスってのは接続して要求を投げて結果を受け取ってそれを処理して接続を閉じるまでの一連に決まってるだろ
>>530の例だって後始末まで書いてあるのに全然大変じゃないだろが
2020/09/08(火) 19:19:05.95ID:gglleEZ2
とりあえずオライリーでも読んだらいいんじゃない
https://www.am;azon.jp/dp/4873118735/
2020/09/09(水) 06:42:52.84ID:N3PFvdWI
スレ的には真っ当な質問なのに当たり強過ぎでしょ
2020/09/09(水) 08:44:06.86ID:7Dxn++Hv
質問じゃなくて文句
2020/09/09(水) 17:07:03.98ID:SFlZHAWP
謙虚に質問してればレスも優しかったかもよ
2020/09/09(水) 21:03:51.38ID:OFM+73CL
分からないだけならともかく延々と自分以外を貶めつつ無能を晒してたからなぁ
2020/09/09(水) 21:12:34.50ID:XGuez22g
それな

× node.js が悪い
× 非同期が悪い
× promise が悪い
× async/awaitが悪い
× 新人がバカ
○ ID:8muSUg7S がバカ

こうだからな
543デフォルトの名無しさん
垢版 |
2020/09/10(木) 14:55:06.91ID:rLZBXCmM
グレたωωω
544デフォルトの名無しさん
垢版 |
2020/09/10(木) 19:56:10.61ID:FWP0gZB+
clusterでマルチプロセスしようとしたんだけど
「EADDRINUSE(ポートが既に使われている)」
エラーがどうしても出てしまいます。
もちろん既に稼働しているnodeはなく、
fork元のapp.jsでlistenしているのと同じポート
子プロセスでまたbindしようとして失敗しているようで
子プロセスは外部からリクエストを受けるような
ものではなく、重い処理をコア分散させて並列処理したいだけです
子プロセスにポート割り当てが必要な理由がよく分かりませんが
恐らく親プロセスと子プロセス間の通信
とかに使うんでしょうか?
子プロセスのポート割り当て回避か、
親プロセスと別ポートを割り当てる方法はありますか?
2020/09/10(木) 20:18:09.02ID:VafdMbGz
> 子プロセスは外部からリクエストを受けるようなものではなく

それならclusterモジュールは必要なくね
clustetは複数のプロセスを使って大量のリクエストを捌くためのもの
ただの子プロセスならchild_processのメソッドを使う
546デフォルトの名無しさん
垢版 |
2020/09/10(木) 20:21:53.78ID:C+K2oJgr
>>545
なるほど、助かりました
じつはworker_threadsも試してみて同じ
エラー出たので
child_processが正解でしたか
これだとポートは関係ない?
2020/09/10(木) 20:43:38.94ID:oBZEl9rg
clusterだと親は子を産むだけの役割じゃなかったっけ
2020/09/10(木) 20:45:06.67ID:oBZEl9rg
あとworker_threadsで同じエラーが出るのはいくらなんでもおかしい
549デフォルトの名無しさん
垢版 |
2020/09/14(月) 20:42:48.98ID:JdQogpR1
>>544 の者ですが
今日これをデバッグしてました。
clusterでもwoker_threadsfでも
child_processでも
「EADDRINUSE」が発生しました

発生するタイミングは子プロセスを生成した時でも
なく
子プロセスでMySQLに対しのコネクション確立時でもなく
確立したDBコネクションからクエリを投げるコード
を実行する時に発生しますが
なぜこのタイミングなのか分かりません

ここで気になったのが
nodeでフロントユーザーに対し
80番ポートをlistenしていて
nodeがローカルのMySQLにアクセスする時
nodeのクライアントポートはフロントと
おなじ80を使うのでしょうか?
それとも別のランダムポートを取得してきて使うのでしょうか?
2020/09/14(月) 20:55:49.60ID:AayaioGL
説明と全然違う事象じゃねーの
せめてエラーメッセージとスタックトレース貼れ
551デフォルトの名無しさん
垢版 |
2020/09/14(月) 20:55:58.86ID:JdQogpR1
続きですか
もう少し調べてみると
「EADDRINUSE」が発生するタイミングは
MySQLに対しコネクション確立後
SQLを投げる時で間違いないと思いますが、
エラーのスタックとレースを見ても
何かのハンドラから駆動されており自分の書いたコードでは
ありません。
nodeかexpressかmysqlモジュールのハンドラ
だと思います

子プロセスはローカルのMySQLに対して
接続して読み書きするだけで
フロントとのやり取りは一切ありませんが

生成元の親プロセスはExpressのapp.js
で立ち上げてるwebアプリです
552デフォルトの名無しさん
垢版 |
2020/09/14(月) 20:56:11.94ID:JdQogpR1
不思議なのが子プロセスで
mysqlとコネクション確立までは失敗せずに
動作し、SQLを投げる段階で
なぜか大元の「app.js」をもう1つ起動しようとしており
app.jsはもう既に起動してるので、
listenポート重複により上記のエラーが発生するわけです
暫定対応で動くようにはなりましたが、
なぜローカルのDBアクセス時にapp.js実行する
動きをするのかの原因がまだ分かっていません

webとは関係ないはずの子プロセスのファイルを
単体でコマンドで実行した場合も
Expressのベースディレクトリにある
「app.js」が実行されていることが分かりました。
自身のコードではこのようなことをしてないので
フレームワークかモジュールの内部処理だと思いますが、
知っている方がいましたら教えてください。
553デフォルトの名無しさん
垢版 |
2020/09/14(月) 20:57:39.11ID:JdQogpR1
>>550
すみません、もう帰宅してしまったのと
機密事項で怒られるのでスタックトレースは貼れません
2020/09/14(月) 21:14:49.11ID:AayaioGL
> 単体でコマンドで実行した場合も
> Expressのベースディレクトリにある
> 「app.js」が実行されていることが分かりました。

clusterも何も関係ねーじゃんwww
断言するがフレームワークもモジュールもmysqlも関係なくてお前のバグだから真面目に仕事しろ
子プロセスから再現に関係ない部分を削除しまくって最小限のここで見せられるコードになるまで書き込まなくていいよ
2020/10/03(土) 14:17:11.74ID:l4QjehZB
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14232251614?sort=1&;page=2
abiko tetuってやつヤバすぎ
2020/10/17(土) 18:10:22.96ID:cX3MrjsP
フォルダ全体をコピーしたくて fs-extra のcopySync()を使うために
const fse = require('fs-extra');
としたら、
internal/modules/cjs/loader.js:968
throw err;
^
Error: Cannot find module 'fs-extra'
というエラーが出ます。
npm install fs-extra

npm install -g fs-extra
を試しましたが、途中で警告が出たりして、結局、元のエラーは直りません。
直す方法はありますでしょうか?
2020/10/17(土) 18:39:14.64ID:cX3MrjsP
>>556
結論的には、

$ npm install -g fs-extra

$ set NODE_PATH=%AppData%\npm\node_modules

としてから、

node xxxx.js

とすると直りました。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況