10年放置した expressjs アプリの修復 後編

続きです。　何とか動く所まで・・・ふう

## npm でセットされている node_modules の構成・・？

拗らせてしまった状況を解きほぐすには、分解しかありません。

package.json を調べます（... 色々やる前に先にやっておけ）。

```json
 "dependencies": {
    "async": "*",
    "bluebird": "^3.7.2",
    "body-parser": "~1.13.1",
    "config": "^3.3.12",
    "cookie-parser": "~1.3.5",
    "date-utils": "~1.2.7",
    "debug": "~2.2.0",
    "ejs": "~2.3.2",
    "express": "~4.13.0",
    "iconv": "^3.0.1",
    "json": "^11.0.0",
    "JSON": "^1.0.0",
    "morgan": "~1.6.0",
    "npm": "^11.1.0",
    "pg": "~4",
    "pg-promise": "~1.7.0",
    "promise": "*",
    "serve-favicon": "~2.3.0"
 },

```
* pg-promise がバージョンで縛られているのを見つけました。これは問題かも。
* node_modules/.package-lock.json の抜粋はこんな感じでした。
```json
    "node_modules/pg-promise": {
      "version": "1.7.8",
      "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-1.7.8.tgz",
      "integrity": "sha512-Lebq7VeFSlsEgoPBdvbIEgijrGfoABFaDR0hslGSM8+VjoM0J85i9bnFko+7rFYaVoV7dkMWASYTmuEFnPEKWQ==",
      "deprecated": "This version of pg-promise is obsolete. You should update to a newer version.",
      "license": "MIT",
      "dependencies": {
        "pg": "4.x",
        "promise": "7.x"
      },
      "engines": {
        "node": ">=0.10",
        "npm": ">=1.4"
      }
    },
    "node_modules/pg-promise/node_modules/promise": {
      "version": "7.3.1",
      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
      "license": "MIT",
      "dependencies": {
        "asap": "~2.0.3"
      }
    },
    
```
* github にあるサンプルコードからちょっと書き足しの pg-promise テストコードが動くだけの package.jsの依存記述はこんな感じ。

```json
   "dependencies": {
    "bluebird": "^3.7.2",
    "pg-monitor": "^2.1.0",
    "pg-promise": "^11.10.2"
  }

```
* テストが 動けばいいだけですが、2025/02/05 最新版です。
* .package.js

```json
   "node_modules/pg-promise": {
      "version": "11.10.2",
      "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.10.2.tgz",
      "integrity": "sha512-wK4yjxZdfxBmAMcs40q6IsC1SOzdLilc1yNvJqlbOjtm2syayqLDCt1JQ9lhS6yNSgVlGOQZT88yb/SADJmEBw==",
      "license": "MIT",
      "dependencies": {
        "assert-options": "0.8.2",
        "pg": "8.13.1",
        "pg-minify": "1.6.5",
        "spex": "3.4.0"
      },
      "engines": {
        "node": ">=14.0"
      },
      "peerDependencies": {
        "pg-query-stream": "4.7.1"
      }
    },
 
```
* node_modules の依存関係、asset-options,pg-minify,spexが増えてます。まあバージョンが飛んでます、放置すれば整合しないでしょう。

## テストすら動かなくなったかの理由を思い出せ　→　 魔がさして "yarn" を使ってしまった。（ボケすぎ）
* モジュール管理には yarn 、mediawikiで js系のトラブルをyarnで整合させた事を思い出してうっかり動かしたのがありました。　そこで色々壊れた？・・
* 依存関係の調整は 月イチくらいのペースで行っていたらトラブルを招かないかもしれません。手元で日常管理しているものはココまで壊れないのですが・・・。
* ちなみにテスト環境も yarn でモジュール依存関係を再整列させてみましたが、こちらは変化なしでした。
* package.json を整える　というのが課題になりそうです　→　https://qiita.com/alfe_below/items/1141ec9acbb81b504855

## テストぐらいは動くようにしてみるぞ。
* package.json 
```json 
"pg-promise": ^11.10.0.2",
```
とバージョン縛りを外します・・・

```sh 
$ npm update
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: dataentry@0.0.1
npm error Found: pg@4.5.7
npm error node_modules/pg
npm error   pg@"~4" from the root project
npm error
npm error Could not resolve dependency:
npm error peer pg@"^8" from pg-query-stream@4.7.1
npm error node_modules/pg-query-stream
npm error   peer pg-query-stream@"4.7.1" from pg-promise@11.10.2
npm error   node_modules/pg-promise
npm error     pg-promise@"^11.10.2" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error

```
* おおっと。取り敢えず --force で。 

```bash
$ npm update --force 
npm warn using --force Recommended protections disabled.
npm warn ERESOLVE overriding peer dependency
npm warn While resolving: pg-query-stream@4.7.1
npm warn Found: pg@4.5.7
npm warn node_modules/pg
npm warn   pg@"~4" from the root project
npm warn
npm warn Could not resolve dependency:
npm warn peer pg@"^8" from pg-query-stream@4.7.1
npm warn node_modules/pg-query-stream
npm warn   peer pg-query-stream@"4.7.1" from pg-promise@11.10.2
npm warn   node_modules/pg-promise
npm warn
npm warn Conflicting peer dependency: pg@8.13.1
npm warn node_modules/pg
npm warn   peer pg@"^8" from pg-query-stream@4.7.1
npm warn   node_modules/pg-query-stream
npm warn     peer pg-query-stream@"4.7.1" from pg-promise@11.10.2
npm warn     node_modules/pg-promise
npm warn ERESOLVE overriding peer dependency

added 20 packages, removed 3 packages, changed 1 package, and audited 396 packages in 8s

25 packages are looking for funding
  run `npm fund` for details
24 vulnerabilities (3 low, 2 moderate, 16 high, 3 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
strnh@ryzen5700-pc:~/workdir/dataentry$ node ./controller/query.js 
DATA: [
  { uid: 0, name: '', 'id': 0 },
  { uid: 2, name: 'foo', 'id': 2 },
  { uid: 4, name: 'bar', 'id': 4 },
  { uid: 999, name: 'baz', 'id': 999 },
  { uid: 500, name: 'hoge', 'id': 500 },
  { uid: 10001, name: 'fuga', 'id': 10001 },
  { uid: 10002, name: 'piyo', '': 10002 }
]
```
* テストは動くようになりました。さてさてココからが本番。

##  routeコードを ES7 で書き換えて自爆 

* github copilot に頼んで ES7っぽく書き換えてみたら不整合が・・
* 深い読み解きが必要なエラーです。

```
$ node --harmony ./bin/www
/home/strnh/workdir/dataentry/node_modules/express/lib/router/index.js:458
      throw new TypeError('Router.use() requires middleware function but got a ' + gettype(fn));
      ^

TypeError: Router.use() requires middleware function but got a Module
    at Function.use (/home/strnh/workdir/dataentry/node_modules/express/lib/router/index.js:458:13)
    at Function.<anonymous> (/home/strnh/workdir/dataentry/node_modules/express/lib/application.js:219:21)
    at Array.forEach (<anonymous>)
    at Function.use (/home/strnh/workdir/dataentry/node_modules/express/lib/application.js:216:7)
    at Object.<anonymous> (/home/strnh/workdir/dataentry/app.js:31:5)
    at Module._compile (node:internal/modules/cjs/loader:1562:14)
    at Object..js (node:internal/modules/cjs/loader:1699:10)
    at Module.load (node:internal/modules/cjs/loader:1313:32)
    at Function._load (node:internal/modules/cjs/loader:1123:12)
    at TracingChannel.traceSync (node:diagnostics_channel:322:14)

Node.js v22.13.1
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

* このエラーは "entry.js" の記述を変更後に出ます。
* entry.js の 末尾に "export default entry;" とかあります。 
* googleで検索すると　"module.export = router;" をつければ治るぞてなことが書いてありますが、どうもそれでは解決しないみたいです。
* ちょっと理解が足りてないので助けてもらおう。読みました。→ "Node.jsのmodule.exportsの仕組みを理解する" https://qiita.com/dys7/items/ced9634650b1b43c7de7
* まだなんか理解が足りてないので読みます：https://www.webdesignleaves.com/pr/jquery/node-js-module-exports.html
* どうやら必要そうな内容：　https://zenn.dev/youtuber/articles/78c3714de04f00
* そういえば、"router" じゃないと routingしないよねぇ。　なんで entry？？？ 
```js
entry.get("/delete", async (req, res, next) => {
    const url_parts = url.parse(req.url, true);
    const { date: dt } = url_parts.query;

```
* まさかまさか、copilot さんが　"router" という文字を "entry" に全部書き換えてたって？　😯
* s/entry/router/g で　取り敢えず 前に進めそう・・・なんてこったい。
* サービスを立ち上げる前にエラーを吐くのはなくなりましたが・・・
### DBアクセスでエラー出るよ（ともあれ解決に進んでいる
```
node --harmony ./bin/www
start
password: undefined
db..
es: [object Object]
getlastrouterdate:
db.getlastrouterdate()::
date: not specify..
 -> 2016/10/07 00:00:00+09
error: relation "jyugyoinmeibo" does not exist
    at Parser.parseErrorMessage (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/parser.js:283:98)
    at Parser.handlePacket (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/parser.js:122:29)
    at Parser.parse (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/parser.js:35:38)
    at Socket.<anonymous> (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/index.js:11:42)
    at Socket.emit (node:events:524:28)
    at addChunk (node:internal/streams/readable:561:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
    at Readable.push (node:internal/streams/readable:392:5)
    at TCP.onStreamRead (node:internal/stream_base_commons:189:23) {
  length: 112,
  severity: 'ERROR',
  code: '42P01',
  detail: undefined,
  hint: undefined,
  position: '18',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'parse_relation.c',
  line: '1452',
  routine: 'parserOpenTable',
  query: 'SELECT name FROM jyugyoinmeibo where ( uid = 10002) ',
  params: undefined
}
node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

error: relation "jyugyoinmeibo" does not exist
    at Parser.parseErrorMessage (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/parser.js:283:98)
    at Parser.handlePacket (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/parser.js:122:29)
    at Parser.parse (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/parser.js:35:38)
    at Socket.<anonymous> (/home/strnh/workdir/dataentry/node_modules/pg-protocol/dist/index.js:11:42)
    at Socket.emit (node:events:524:28)
    at addChunk (node:internal/streams/readable:561:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
    at Readable.push (node:internal/streams/readable:392:5)
    at TCP.onStreamRead (node:internal/stream_base_commons:189:23) {
  length: 112,
  severity: 'ERROR',
  code: '42P01',
  detail: undefined,
  hint: undefined,
  position: '18',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'parse_relation.c',
  line: '1452',
  routine: 'parserOpenTable',
  query: 'SELECT name FROM jyugyoinmeibo where ( uid = 10002) ',
  params: undefined
}

Node.js v22.13.1
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

````
* これは原因がすぐ分かりました。 DBスキーマ名の不整合でした。クリアしました。

# 動き出しましたが、さてさて次の難所に来ました。

Failed to lookup view "router" in views directory "/home/strnh/workdir/dataentry/views"

Error: Failed to lookup view "router" in views directory "/home/strnh/workdir/dataentry/views"
    at Function.render (/home/strnh/workdir/dataentry/node_modules/express/lib/application.js:579:17)
    at ServerResponse.render (/home/strnh/workdir/dataentry/node_modules/express/lib/response.js:961:7)
    at /home/hiko/workdir/kojiya2/test/routes/entry.js:87:9
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
  
----

* router に全部書き換えてしまったので entry.ejs が読めなくなってる！

## 解決

* 何とか動きました・・・
![Screenshot 2025-02-03 at 20-19-46 鍍金液分析結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91470/b10de2e0-a2bb-9210-5188-556378065faf.png)


* メッキ屋さんなんでこんなデータを集めていました。

以上