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

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

ただいまの
回答率

88.82%

ElectronでMySQLに接続できない

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 966

tomoharu

score 78

・やりたいこと:electoronのプロジェクトをmysqlに接続したい。

・環境
OS:Mac
フロント:react
node -v: 10.7.0
electron -v: 5.0.1
MySQL -v: 8.0.12

・起こっているエラー:TypeError: Net.createConnection is not a function
(一番直近のエラーコードは以下):

Connection.connect
node_modules/mysql/lib/Connection.js:86
  83 | if (!this._connectCalled) {
  84 |   this._connectCalled = true; // Connect either via a UNIX domain socket or a TCP socket.
  85 | 
> 86 |   this._socket = this.config.socketPath ? Net.createConnection(this.config.socketPath) : Net.createConnection(this.config.port, this.config.host); // Connect socket to connection domain
     | ^  87 | 
  88 |   if (Events.usingDomains) {
  89 |     this._socket.domain = this.domain;

・行ったこと:
>electronのインストール

#package.json
{
  "name": "youtubist",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "mysql": "^2.17.1",
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-scripts": "3.0.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "electron": "electron ."
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "electron": "^5.0.1"
  },
  "main": "src/main.js"
}


>mysqlのインストールとサーバーの開始

npm install mysql
mysql.server start

>main.jsの記述

const electron = require('electron')
const { app, BrowserWindow } = require('electron')
const { Net } = require('net')

const path = require('path')
const url = require('url')
let mainWindow;

function createWindow() {
    mainWindow = new BrowserWindow({
        width: 800,
        height: 600
    });
    mainWindow.loadURL('http://localhost:3000');
    mainWindow.on('closed', function(){
        mainWindow = null
    })
}

app.on('ready', createWindow)
app.on('window-all-closed', function(){
    if (process.platform !== 'darwin'){
        app.quit();
    }
});
app.on('activate', function(){
    if (mainWindow === null){
        createWindow();
    }
});


>レンダラープロセスにて、dbとの接続コードを記述

/*src/register.js*/
import React from 'react';
import ReactDOM from 'react-dom';
import * as serviceWorker from './serviceWorker';
const { Net } = require('net')

class Register extends React.Component {
  connectToDatabase(){
    var mysql = require('mysql')
    var connection = mysql.createConnection({
      host: 'localhost',
      user: 'admin',
      password: 'password',
      database: 'youtubist_database'
    })
    connection.connect();
  }
  render() {
    this.connectToDatabase()
    return (
      <React.Fragment>
        <input type="text"></input>
        <button>register</button>
      </React.Fragment>
    )
  }
}

export default Register


エラーが出ているのはこのファイルのconnection.connect()です。

・自分の推察:
>これはelectronでは無く、nodejsの問題だと思っている。
>connectToDatabase()を行う場所がメインプロセスである必要があると思っている。
しかし、一回mainにconnectToDatabse()等を記述したがそもそも実行されない。
connection.connect()の実行に成功したら、console.log("success"),失敗したらconsole.log("fail")とするif文を書いたが、
どちらも画面に出ない。

なにとぞお力添えのほどよろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • tomoharu

    2019/05/13 20:08

    ご回答ありがとうございます。メイン側でコードを書いてみたところ、下記エラーが発生しました。

    A JavaScript error occurred in the main process
    Uncaught Exception:
    TypeError: this.connectToDatabase is not a function
    at App.createWindow (/Users/username/projects/youtubist/src/main.js:18:7)
    at App.emit (events.js:199:15)

    おっしゃる通り、レンダラー側でもメイン側でも同じエラーが起こるので、これはメイン、レンダラー間の差異ではなく、そもそものelectronかnodejsの設定に問題があるかと思いました。取り急ぎご共有いたします。まずは、最低限のelectronで接続確認を試します。そちらが終わり次第、また再度ご相談させてください。お手数ですが何卒よろしくお願いします。
    また記述したコードは以下です。

    ```
    /*main.js*/
    const electron = require('electron')
    const { app, BrowserWindow } = require('electron')
    const { Net } = require('net')

    const path = require('path')
    const url = require('url')
    let mainWindow;

    function createWindow() {
    mainWindow = new BrowserWindow({
    width: 800,
    height: 600
    });
    mainWindow.loadURL('http://localhost:3000&#039;);
    mainWindow.on('closed', function(){
    mainWindow = null
    })
    this.connectToDatabase();
    }

    function connectToDatabase(){
    var mysql = require('mysql')
    var Connection = mysql.createConnection({
    host: 'localhost',
    user: 'admin',
    password: 'password',
    database: 'youtubist_database'
    })
    Connection.connect();
    Connection.query('SELECT * from video')
    }

    app.on('ready', createWindow)
    app.on('window-all-closed', function(){
    if (process.platform !== 'darwin'){
    app.quit();
    }
    });
    app.on('activate', function(){
    if (mainWindow === null){
    createWindow();
    }
    });

    ```

    キャンセル

  • mar-kn

    2019/05/13 23:33

    TypeError: this.connectToDatabase is not a function
    こちらのエラーは this に connectToDatabase が見つかっていないため発生しているので、
    this. を取って、connectToDatabase だけにしたら解決するのではないでしょうか。

    キャンセル

  • tomoharu

    2019/05/14 22:36

    ありがとうございます。thisをとってみたところ、下記エラーとなりました。おそらくMySQLとの接続エラーです。

    ```
    A JavaScript error occurred in the main process

    Uncaught Exception:
    Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError
    ```
    次はこの接続方法を当たってみます。お時間取らせて申しわけございません。おそらくver8から実装されたmysqlの認証仕様変更によるものかと思います。これを解決しましたらまたご相談させてください。何卒よろしくお願いします。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る