Hướng dẫn cannot find module mysql2/promise - không thể tìm thấy mô-đun mysql2/lời hứa

Tôi muốn sử dụng Docker Compose để kết nối một chương trình nút, trong một thùng chứa, với cơ sở dữ liệu MySQL, trong một thùng chứa khác.Cơ sở dữ liệu dường như bắt đầu tốt, nhưng tệp index.js của tôi đã gây ra lỗi:

+ 
updated 1 package and audited 101 packages in 3.772s
found 0 vulnerabilities
0

Tôi đã thử cài đặt các gói khác nhau với NPM và thậm chí đã chỉnh sửa các dòng khác nhau trong tệp pack.json của tôi trong tuyệt vọng, nhưng không có kết quả;Luôn luôn cùng một lỗi.Dưới đây là các tệp có liên quan và đầu ra của các lệnh hoạt động cho đến nay.

$ npm cài đặt mysql2

npm WARN  No repository field.
npm WARN  No license field.

+ 
updated 1 package and audited 101 packages in 3.302s
found 0 vulnerabilities

$ sudo npm cài đặt mysql2-promise

+ 
updated 1 package and audited 101 packages in 3.772s
found 0 vulnerabilities

package.json

{
    "name": "simplyanything",
    "version": "1.0.0",
    "scripts": {
        "start": "node index.js"
    },
    "description": "Actions party game",
    "dependencies": {
        "express": "^4.17.1",
        "mysql2": "^2.3.3",
        "mysql2-promise": "^0.1.4",
        "socket.io": "^4.4.1"
    },
    "author": "Chris DeHaan"
}

index.js

const express = require('express');
let app = express();
let http = require('http').createServer(app);
const io = require('socket.io')(http, {pingTimeout: 60000});

app.use(express.static('public'));
app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); });
http.listen(3000, () => { console.log('listening on *:3000'); });

const mysql = require('mysql2/promise');
const pool = mysql.createPool({
    connectionLimit : 100,
    host: process.env.MYSQL_HOST,
    user: process.env.MYSQL_USER,
[.... and so on]

Dockerfile

FROM node:latest
WORKDIR /sa/
COPY package.json .
RUN npm install
COPY . .

docker-compose.yml

version: '3.8'
services: 
    web:
      build:
          context: .
      env_file: ./.env
      command: npm start
      volumes: 
          - .:/sa/
          - /sa/node_modules
      ports:
          - $NODE_LOCAL_PORT:$NODE_DOCKER_PORT
      depends_on: 
          - mysqldb
      environment: 
          MYSQL_HOST: mysqldb
    mysqldb:
      image: mysql
      env_file: ./.env
      environment: 
          MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
          MYSQL_DATABASE: $MYSQL_DATABASE
      ports:
          - $MYSQL_LOCAL_PORT:$MYSQL_DOCKER_PORT
      volumes:
          - mysql:/var/lib/mysql
          - mysql_config:/etc/mysql
volumes:
    mysql:
    mysql_config:

.env

MYSQL_USER=simplyanythingUser
MYSQL_ROOT_PASSWORD=[Well, you don't need to know this]
MYSQL_DATABASE=simplyanything
MYSQL_LOCAL_PORT=3306
MYSQL_DOCKER_PORT=3306

NODE_LOCAL_PORT=3000
NODE_DOCKER_PORT=3000

$ sudo docker xây dựng -t sa.

Sending build context to Docker daemon  9.526MB
Step 1/5 : FROM node:latest
 ---> e6bed6a65a54
Step 2/5 : WORKDIR /sa/
 ---> Using cache
 ---> 3da61e5a5928
Step 3/5 : COPY package.json .
 ---> Using cache
 ---> 1e7bbeaaa894
Step 4/5 : RUN npm install
 ---> Using cache
 ---> 52f36e54d698
Step 5/5 : COPY . .
 ---> e0a50567567b
Successfully built e0a50567567b
Successfully tagged sa:latest

$ node index.js

Debugger listening on ws://127.0.0.1:44273/a1b49bfc-83e7-47dd-ba53-64a8df19ccc9
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.
listening on *:3000

(và nó hoạt động trong trình duyệt vào thời điểm này)

$ sudo docker-compose up

Starting sa_mysqldb_1 ... done
Starting sa_web_1     ... done
Attaching to sa_mysqldb_1, sa_web_1
mysqldb_1  | 2022-02-08 08:31:21+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started.
mysqldb_1  | 2022-02-08 08:31:21+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysqldb_1  | 2022-02-08 08:31:21+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started.
mysqldb_1  | 2022-02-08T08:31:21.660916Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.28) starting as process 1
mysqldb_1  | 2022-02-08T08:31:21.747461Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
web_1      | 
web_1      | >  start
web_1      | > node index.js
web_1      | 
mysqldb_1  | 2022-02-08T08:31:23.587278Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
web_1      | node:internal/modules/cjs/loader:936
web_1      |   throw err;
web_1      |   ^
web_1      | 
web_1      | Error: Cannot find module 'mysql2/promise'
web_1      | Require stack:
web_1      | - /sa/index.js
web_1      |     at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
web_1      |     at Function.Module._load (node:internal/modules/cjs/loader:778:27)
web_1      |     at Module.require (node:internal/modules/cjs/loader:999:19)
web_1      |     at require (node:internal/modules/cjs/helpers:102:18)
web_1      |     at Object.<anonymous> (/sa/index.js:13:15)
web_1      |     at Module._compile (node:internal/modules/cjs/loader:1097:14)
web_1      |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
web_1      |     at Module.load (node:internal/modules/cjs/loader:975:32)
web_1      |     at Function.Module._load (node:internal/modules/cjs/loader:822:12)
web_1      |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) {
web_1      |   code: 'MODULE_NOT_FOUND',
web_1      |   requireStack: [ '/sa/index.js' ]
web_1      | }
web_1      | 
web_1      | Node.js v17.4.0
mysqldb_1  | 2022-02-08T08:31:25.086275Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysqldb_1  | 2022-02-08T08:31:25.086445Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysqldb_1  | 2022-02-08T08:31:25.277625Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysqldb_1  | 2022-02-08T08:31:25.354311Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
mysqldb_1  | 2022-02-08T08:31:25.355558Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.28'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

Tôi thực sự bị mắc kẹt bởi vì mọi thứ nó cần dường như được cài đặt và nó hoạt động khi tôi chạy nó trên dòng lệnh với

+ 
updated 1 package and audited 101 packages in 3.772s
found 0 vulnerabilities
1 nên rõ ràng là có thứ gì đó tôi thiếu khi thiết lập container của mình hoặc kết nối để kết nối chúng.Bât cư lơi khuyên nao cung se được đanh gia cao.Chúc mừng.