React + Node + Docker + Postgres (#2 Node構築)

前回はフロントエンド側の環境を構築したので、今回はバックエンド側を構築していきます。(前回の記事は下記になります)

Node構築

バックエンド側ではNode.jsのexpressで構築していきます。

npm i -S express
npm i -D babel-cli
npm i -D nodemon concurrently

バックエンドAPIを作成します。

mkdir -p ./src/app/js
touch ./src/app/js/main.js

main.jsを編集します。

const express = require("express");
const path = require("path");

const app = express();

app.get('/api/node', (req, res) => {
 res.send({api: 'Connected Node'});
})

app.listen(3000, ()=> {
 console.log('app running');
})

package.jsonのscriptsにバックエンドを起動するように追記します。

"app": "nodemon src/app/js/main.js  --exec babel-node",
"dev": "concurrently \"npm run front\" \"npm run app\""

バックエンドを起動します。

npm run app

ブラウザで「localhost:3000/api/node」にアクセスするとレスポンスが帰って来ます。

スクリーンショット 2020-10-10 6.24.34


React - Node連携

それではフロントエンドとバックエンドを繋げてみます。
localhost:8080/apiのリクエストをlocalhost:3000/apiにリクエストするProxyを起動するようにします。
webpack.config.jsのmodule.exportsにを以下を追記します。

devServer: {
 historyApiFallback: true,
 open: true,
 host: 'localhost',
 port: 8080,
 proxy: {
   '/api/**': {
     target: 'http://localhost:3000',
     secure: false,
     logLevel: 'debug'
   }
 },
}

フロントエンドからapiにリクエストし取得した結果を表示するようにします。

mkdir ./src/front/js/utils
touch ./src/front/js/utils/HttpUtils.js
mkdir ./src/front/js/node
touch ./src/front/js/node/Node.jsx

HttpUtil.js

import _ from "lodash";

const HEADERS_CONTENT_TYPE_JSON = {
 headers: {
   "Content-Type": "application/json"
 }
};

export function get(path, options) {
 const opts = {
   ...options
 };
 return fetch(path, opts);
}

const isNullish = v => _.isNull(v) || _.isUndefined(v);

export function parseQueryString(searchParams) {
 if (!searchParams) return {};
 if (_.isString(searchParams)) {
   searchParams = new URLSearchParams(searchParams);
 }
 if (searchParams instanceof URL) {
   searchParams = searchParams.searchParams;
 }
 let obj = {};
 for (let [key, value] of searchParams.entries()) {
   if (isNullish(obj[key])) {
     obj[key] = value;
   } else if (_.isArray(obj[key])) {
     obj[key].push(value);
   } else {
     obj[key] = [obj[key], value];
   }
 }
 return obj;
}

export function toQueryString(params) {
 return params ? "?" + new URLSearchParams(params) : "";
}

export function getJSON(path, params, options) {
 const opts = {
   ...HEADERS_CONTENT_TYPE_JSON,
   ...options
 };
 const query = toQueryString(params);
 return get(`${path}${query}`, opts).then(resp => resp.json());
}

export function post(path, body, options) {
 const opts = {
   method: "POST",
   body,
   ...options
 };
 return fetch(path, opts).then(resp => resp.json());
}

export function postJSON(path, data, options) {
 const opts = {
   ...HEADERS_CONTENT_TYPE_JSON,
   ...options
 };
 return post(path, JSON.stringify(data), opts);
}

export function del(path, body, options) {
 const opts = {
   method: "DELETE",
   body,
   ...options
 };
 return fetch(path, opts).then(resp => resp.json());
}

export function deleteJSON(path, data, options) {
 const opts = {
   ...HEADERS_CONTENT_TYPE_JSON,
   ...options
 };
 return del(path, JSON.stringify(data), opts);
}

Node.jsx

import React, { Component } from 'react';
import { getJSON } from "../utils/HttpUtils";

export default class NodeApp extends React.Component {

 state = {
   nodeResult: []
 }
   
 componentDidMount() {
   const responseJson = getJSON("/api/node")
   .then(responseJson => this.setState({ nodeResult: responseJson.api }));
 }
 
 render() {
   return (
     <div className="NodeApp">
       <div>
         {this.state.nodeResult}
       </div>
     </div>
   );
 }
}

src/fornt/js/main.jsからNode.jsxを呼び出せるように修正します。
Node.jsxをインポートします。

main.js

import React from "react";
import ReactDOM from "react-dom";
import NodeApp from './node/Node'

const Index = () => {
 return (
   <div>Hello React! <NodeApp /></div>
 );
};

ReactDOM.render(<Index />, document.getElementById("root")); 

フロントエンド、バックエンドを起動しましょう。

npm run dev

画像2

src/app/js/main.jsの「Connected Node」に「!」を追加してみます。
バックエンドの再起動はしなくてもブラウザの更新のみで「Connected Node!」となります。

画像3

ここまでのものはこちらになります。
https://github.com/YosukeKondo/react-node-docker-postgres/releases/tag/v2.0_node


VSCodeでデバッグ

バックエンドのデバッグできるようにします。
①左メニューバーのデバッグをクリック
②「launch.jsonファイルを作成します」をクリック
③「Node.js」をクリック

画像4

画像5

launch.jsonが自動作成されるので、下記の通りに編集します。

{
   // IntelliSense を使用して利用可能な属性を学べます。
   // 既存の属性の説明をホバーして表示します。
   // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
   "version": "0.2.0",
   "configurations": [
       {
           "type": "node",
           "request": "launch",
           "name": "プログラムの起動",
           "skipFiles": [
               "<node_internals>/**"
           ],
           "program": "${workspaceFolder}/src/app/js/main.js"
       }
   ]
}

デバッグを起動します

画像6

任意のところでブレークポイントを貼ります。
バックエンド側は上記で起動していますので、フロントエンド側を起動する(「npm run front」)とデバッグができます。

画像7

次はDockerで起動できるようにします。


この記事が気に入ったらサポートをしてみませんか?