Как развернуть с помощью sequelize и реагировать в heroku

#javascript #node.js #reactjs #heroku #environment-variables

Вопрос:

Это мой package.json :

 {
  "name": "aracelli-v-photography-website",
  "version": "0.0.3",
  "private": true,
  "description": "a photography website",
  "main": "api/server.js",
  "scripts": {
    "start": "concurrently -p "{name}" -c "green" -n "database,node" "npx sequelize-cli db:migrate --env=production" "HOSTING_DIR=livebuild/ node server"",
    "dev": "concurrently -p "{time}-{name}" -c "green" -n "react,nodemon" "react-scripts build" "nodemon server"",
    "test": "concurrently -p "{time}-{name}" -c "green" -n "database,node" "DATABASE_URL=$(heroku config:get DATABASE_URL -a aracelli-v-photography) npx sequelize-cli db:migrate --env=production" "DATABASE_URL=$(heroku config:get DATABASE_URL -a aracelli-v-photography) node server"",
    "build": "BASE_URL="https://aracelli-v-photography.herokuapp.com/api" react-scripts build amp;amp; rm -rf livebuild amp;amp; mv build livebuild"
  },
  "repository": {
    "type": "git",
    "url": "git https://github.com/Aracelli-V-Photography/aracelli-v-photography-website.git"
  },
  "author": "jadelynnmasker",
  "license": "GPL-3.0-or-later",
  "bugs": {
    "url": "https://github.com/Aracelli-V-Photography/aracelli-v-photography-website/issues"
  },
  "homepage": "/",
  "devDependencies": {
    "axios": "^0.21.1",
    "eslint": "^7.28.0",
    "nodemon": "^2.0.7",
    "prettier": "^2.3.1",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-redux": "^7.2.4",
    "react-router-dom": "^5.2.0",
    "react-scripts": "^4.0.3",
    "redux": "^4.1.0",
    "redux-devtools-extension": "^2.13.9",
    "redux-thunk": "^2.3.0",
    "uuid": "^8.3.2"
  },
  "dependencies": {
    "bcrypt": "^5.0.1",
    "concurrently": "^6.2.0",
    "njwt": "^1.1.0",
    "pg": "^8.6.0",
    "pg-hstore": "^2.3.4",
    "sequelize": "^6.6.2",
    "sequelize-cli": "^6.2.0"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }My question is, why doesn't the server deploy with react
}
 

И мой server.js :

 const http = require("http");
const url = require("url");
const fs = require("fs");
const path = require("path");

const routes = require("./config/routes");

const PORT = process.env.PORT || 3000;
const HOME_DIRECTORY = process.cwd();
const STATIC_DIRECTORY = process.env.HOSTING_DIR || "build/";

const server = http.createServer(function (request, response) {
    try {
        process.chdir(HOME_DIRECTORY);
    } catch (error) {
        console.log(error);
    }

    if (request.url.split("/")[1] !== "api") {
        const parsedUrl = url.parse(request.url);
        let pathname = `.${parsedUrl.pathname}`;
        const extension = path.parse(pathname).ext;

        try {
            process.chdir(STATIC_DIRECTORY);
        } catch (error) {
            return console.log(error);
        }

        const mapExtensionsToContentType = {
            ".ico": "image/x-icon",
            ".html": "text/html",
            ".js": "text/javascript",
            ".json": "application/json",
            ".css": "text/css",
            ".png": "image/png",
            ".jpg": "image/jpeg",
            ".wav": "audio/wav",
            ".mp3": "audio/mpeg",
            ".svg": "image/svg xml",
            ".pdf": "application/pdf",
            ".doc": "application/msword",
        };

        fs.exists(pathname, function (exist) {
            if (!exist) {
                response.statusCode = 301;
                response.setHeader("Location", "/");
                return response.end(() => {
                    console.log(
                        "nUser probably refreshed the page. Stand by for new session!"
                    );
                });
            }

            if (pathname === "./") {
                pathname  = "index.html";
                console.log("nUser joined the site!");
            }

            fs.readFile(pathname, function (error, data) {
                if (error) {
                    response.statsCode = 500;
                    response.end(`Error getting the file: ${error}`);
                    return console.error(`Error getting the file: ${error}`);
                }
                response.setHeader(
                    "Content-Type",
                    mapExtensionsToContentType[extension] || "text/html"
                );
                response.end(data);
            });
        });
    } else {
        const actionPath = `${request.method} ${request.url}`;
        const route = routes.find(function (route) {
            return actionPath.match(route[0]);
        });
        if (!route) {
            return console.log(`n${actionPath} -> undefined`);
        }
        console.log(`n${actionPath} -> ${route[1]}`);
        const [controllerName, method] = route[1].split("#");
        const Controller = require(`./controllers/${controllerName}Controller`);
        if (request.method !== "POST") {
            const controller = new Controller(request, response);
            controller[method]();
        } else {
            let body = "";
            request.on("data", function (chunk) {
                body  = chunk.toString();
            });
            request.on("end", function () {
                controller = new Controller(
                    request,
                    response,
                    JSON.parse(body)
                );
                controller[method]();
            });
        }
    }
});

server.listen(PORT, function () {
    console.log("Server running on port "   PORT);
});
 

Наконец, мой /src/redux/common.js , где, я думаю, проблема в:

 import axiosBase from "axios";
import { v4 as uuidv4, v5 as uuidv5 } from "uuid";

export const axios = axiosBase.create({
  baseURL: process.env.BASE_URL || "http://localhost:3000/api",
});

const NAMESPACE = uuidv4();

export function uuid() {
  return uuidv5(uuidv4(), NAMESPACE);
}
 

В принципе, я пытаюсь провести Node.js сервер с большим количеством знаний в React, чем в Node, и я застрял здесь, потому что, что бы я ни делал, axios всегда отправляет запросы на «http://localhost:3000/api». Мне нужно развернуть на heroku и отправить запросы на heroku вместо моей локальной машины! Я посмотрел документы для приложения create-react, и, похоже, я все делаю правильно. Однако я всегда использую производственную сборку react, потому что не мог понять, где найти сборку разработки. Из-за того, как он развернут на heroku (сервер моего узла обслуживает приложение react, а также api) Я не хочу, чтобы мое приложение работало на двух разных портах и нуждалось в cors.

Теперь, когда с этим покончено, у моей проблемы есть в основном два решения, которые сделают меня счастливым. Во-первых, я мог бы найти, где находится сборка разработки, и использовать переменную NODE_ENV enviromnent, чтобы определить, нахожусь ли я на сервере или нет. Или, во-вторых, я мог бы найти способ заставить переменные среды, которые я использую, работать.

В любом случае, я ценю ваше время и внимание. Если потребуется дополнительная информация, я с удовольствием опубликую обновление.

Ответ №1:

С твоим приложением нет никаких проблем, братан. Вы допустили ошибку в своем package.json . То, что вы сделали, это включили свой dependencies в devDependencies , что означает, что модуль react не устанавливается в вашем приложении Heroku.

Во время развертывания вы заметите, что на нем отображается строка pruning devDependencies , означающая, что он вырезает пакеты из списка, которые находятся в списке devDependencies .

Шаги, чтобы все исправить:

Для этого вы должны включить свой devDependencies dependencies вход, чтобы выполнить эту команду

 npm install axios react react-dom react-redux 
react-router-dom react-scripts redux redux-devtools-extension redux-thunk uuid --save-prod
 

Теперь переместите свое приложение на Heroku, и оно начнет работать.

введите описание изображения здесь