Мое приложение fullsatck JS не работает в рабочей среде на Heroku

#node.js #reactjs #database #postgresql #heroku

#node.js #reactjs #База данных #postgresql #heroku

Вопрос:

Я создал свое первое приложение FullStack JS. REACT для переднего порта: 3000, NODE для заднего порта 3001 и postgresql для базы данных. И это также первый раз, когда я использую Heroku!

Мое приложение под названием philosophybooks моя база данных postgres — это livres с одной таблицей книг в этой таблице 13 строк, 13 книг в моей базе данных, это просто для примера :
author, title, date_of_parution, cover обложка — это просто строка, у меня есть папка illustrations_books в моей интерфейсной части моего приложения, в этой папке у меня есть все изображения обложки

С CLI в Windows у меня есть все мои приложения, с моей базой данных все хорошо на Heroku.Впереди я запустил папку сборки и скопировал ее в задней части моего приложения.
Когда я начинаю heroku local web все отлично работать на http:localhost:5000
но когда я запускаю свое приложение не локально, у меня появляется ошибка консоли

ПОЛУЧИТЬ https://philosophybooks .herokuapp.com/livres 503 (Служба недоступна)

в передней части package.json я "proxy": "http://localhost:3001"

небольшая часть index.js

 ...   
app.use(express.static('build'))
...   

//Entry point API 
app.get('/', (req, res) => {
    res.send('My app is well connected and endpoint is OK')
})
//READ ALL
app.get("/livres", (req, res) => {
    pool.query('SELECT * FROM books ORDER BY id ASC', (err, results) => {
        if (!err)
            res.status(200).json(results.rows)
        else
            console.log(err)
    })
})

...
...  

const port = process.env.PORT || 3001
app.listen(port, () => {
    console.log(`[Express] is running on port ${port}`)
})

  

Небольшая часть Livres.jsx в передней части

 ...
...  

useEffect(() => {
        const fetchData = async () => {
            setIsError(false)
            try {
                const result = await axios('/livres') /* 'http://localhost:3001/livres' */
                setData(result.data)
            } catch (error) {
                setIsError(true)
                console.log(error)
            }
        }
        fetchData()
    }, [])  
...  
...
  

config.js

 require('dotenv').config()

const { Pool } = require('pg')

/* const pool = new Pool({
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    database: process.env.DB_DATABASE,

}) */
const isProduction = process.env.NODE_ENV === 'production'

const connectionString = `postgresql://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_DATABASE}`

const pool = new Pool({
  connectionString: isProduction ? process.env.DATABASE_URL : connectionString,
  ssl: isProduction,
})
module.exports = { pool }
  

У меня также есть файл Procfile web: node index.js

серверная часть package.json

 {
    "name": "philosophybooks",
    "version": "1.0.0",
    "description": "bibliothéque philosophique",
    "main": "index.js",
    "engines": {
        "node": "12.x",
        "npm": "6.x"
    },
    "scripts": {
        "start": "nodemon index.js",
        "test": "echo "Error: no test specified" amp;amp; exit 1"
    },
    "keywords": [
        "NODEJS",
        "JAVASCRIPT",
        "ES6"
    ],
    "author": "LC",
    "license": "ISC",
    "dependencies": {
        "compression": "^1.7.4",
        "cors": "^2.8.5",
        "dotenv": "^8.2.0",
        "express": "^4.17.1",
        "helmet": "^4.1.1",
        "nodemon": "^2.0.4",
        "path": "^0.12.7",
        "pg": "^8.3.3"
    }
}
  

Визуализация heroku local web
когда все работает отлично в локальном heroku

Визуализация в prod https://philosophybooks.herokuapp.com/
производство рендеринга

Я должен сделать ошибку, которую я не вижу или что-то забыл, вы можете мне помочь? если вам нужно увидеть что-то еще, скажите мне. Заранее благодарю вас за помощь


РЕДАКТИРОВАТЬ 18 октября 2020 г.

Моя база данных на HEROKU и через CLI pg: psql на HEROKU

Просмотр базы данных через pg: psql CLI

Комментарии:

1. Привет, @Parad0xJ, у тебя есть весь код на github?

2. Привет @HenryLy Нет, я только что запустил репозиторий с помощью CLI, но я не размещал его на Github. Я сразу же отправляюсь в спорт, я вернусь через 3 часа, я выложу свой код на Github, когда вернусь, и я помещу ссылку здесь. Я перепробовал много разных вещей, но все еще не могу правильно видеть свое приложение на Heroku. Спасибо за вашу помощь

3. @HenryLy весь мой код здесь: философские книги на GitHub

4. потрясающе! Можете ли вы также передать мне свою схему базы данных? Мне нужно распечатать его в heroku, чтобы его можно было правильно развернуть

5. Я смог успешно развернуть ваше приложение, но я думаю, что проблема заключалась в том, что вы не добавили свою таблицу в heroku. Как только вы передадите мне свою таблицу, я думаю, что смогу поближе взглянуть на проблему

Ответ №1:

Bonjour Parad0xJ,

ПРОБЛЕМА:

Оно не работало, потому что вы назначали ssl-сертификат, который не был проверен. Если вы внимательно посмотрите на ошибку heroku, вы заметите эту ошибку.

 Error: self signed certificate
'DEPTH_ZERO_SELF_SIGNED_CERT'

const pool = new Pool({
  connectionString: isProduction ? process.env.DATABASE_URL : connectionString,
  ssl: isProduction,  <=========== unverified self signed certificate
})
  

РЕШЕНИЕ

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

 const pool = new Pool({
  connectionString: isProduction ? process.env.DATABASE_URL : connectionString,
  sslmode: isProduction ? "require" : "disable"
})
  

Также вам нужно добавить * route в нижний, потому что, когда он находится вверху, другие маршруты недоступны:

 app.get('*', (req, res) => { //<=========== Should be at the bottom of all routes
  res.sendFile(path.join(__dirname, "frontend/build/index.html"));
}); 
  

Вот вся конфигурация в этом репозитории git :

https://github.com/l0609890/philosophybook/invitations

Комментарии:

1. В целом мне нравится тема философии!

2. Я видел эту ошибку в журналах, но я не понимал, откуда она взялась, теперь я понимаю. Но даже с sslmode я все еще не вижу свое приложение на heroku. Я люблю философию!!

3.Должна быть еще одна ошибка, я сомневаюсь, что в этих строках кода на этой стороне тоже не будет ошибки? //app.use(express.static('./frontend/build')) //app.use(express.static(path.join(__dirname, 'build'))) if (process.env.NODE_ENV === "production") { app.use(express.static(path.join(__dirname, "frontend/build"))); } app.get('*', (req, res) => { res.sendFile(path.join(__dirname, "frontend/build/index.html")); });

4. Интересно, мне нужно уйти на несколько часов, но я вернусь к проверке этой проблемы для вас.

5. эй, @Parad0xJ, я видел, что вы добавили свой * route вверху, чтобы другие маршруты не могли получить к нему доступ. Вот код, который я развернул, и я также прикрепил фактический веб-сайт:github.com/l0609890/philosophybook/invitations