Я успешно развернул это приложение раньше, но теперь, когда я пытаюсь развернуть новый код, я получаю ошибку H10, как только я запрашиваю приложение из браузера.
Журнал из журналов heroku - tail
То, что я пробовал до сих пор:
- Проверено express прослушивает process.env.PORT, а не "process.env.port"
heroku restart
heroku local web
, который работает просто отлично - Проверено, что все переменные окружения, которые я использую, установлены в конфигурации heroku
- Проверенные зависимости ( честно говоря, я не уверен на 100%, если что-то пропустил)
- Удалил экземпляр Heroku dyno и создал fre sh deploy
Оцените любую помощь. Спасибо.
сервер / индекс. js:
const express = require('express')
const morgan = require('morgan')
const compression = require('compression')
const session = require('express-session')
const passport = require('passport')
const SequelizeStore = require('connect-session-sequelize')(session.Store)
const db = require('./db')
const sessionStore = new SequelizeStore({db})
const PORT = process.env.PORT || 8080
const app = express()
module.exports = app
// This is a global Mocha hook, used for resource cleanup.
// Otherwise, Mocha v4+ never quits after tests.
if (process.env.NODE_ENV === 'test') {
after('close the session store', () => sessionStore.stopExpiringSessions())
}
/**
* In your development environment, you can keep all of your
* app's secret API keys in a file called `secrets.js`, in your project
* root. This file is included in the .gitignore - it will NOT be tracked
* or show up on Github. On your production server, you can add these
* keys as environment variables, so that they can still be read by the
* Node process on process.env
*/
if (process.env.NODE_ENV !== 'production') require('../secrets')
// passport registration
passport.serializeUser((user, done) => done(null, user.id))
passport.deserializeUser(async (id, done) => {
try {
const user = await db.models.user.findByPk(id)
done(null, user)
} catch (err) {
done(err)
}
})
const createApp = () => {
// logging middleware
app.use(morgan('dev'))
// body parsing middleware
app.use(express.json())
app.use(express.urlencoded({extended: true}))
// compression middleware
app.use(compression())
// session middleware with passport
app.use(
session({
secret: process.env.SESSION_SECRET || 'none',
store: sessionStore,
resave: false,
saveUninitialized: false
})
)
app.use(passport.initialize())
app.use(passport.session())
// auth and api routes
app.use('/auth', require('./auth'))
app.use('/api', require('./api'))
// static file-serving middleware
app.use(express.static(path.join(__dirname, '..', 'public')))
// any remaining requests with an extension (.js, .css, etc.) send 404
app.use((req, res, next) => {
if (path.extname(req.path).length) {
const err = new Error('Not found')
err.status = 404
next(err)
} else {
next()
}
})
// sends index.html
app.use('*', (req, res) => {
res.sendFile(path.join(__dirname, '..', 'public/index.html'))
})
// error handling endware
app.use((err, req, res, next) => {
console.error(err)
console.error(err.stack)
res.status(err.status || 500).send(err.message || 'Internal server error.')
})
}
const startListening = () => {
// start listening (and create a 'server' object representing our server)
app.listen(PORT, '0.0.0.0', () => console.log(`Spinning up on PORT: ${PORT}`))
// set up our socket control center
}
const syncDb = () => db.sync()
async function bootApp() {
await sessionStore.sync()
await syncDb()
await createApp()
await startListening()
}
// This evaluates as true when this file is run directly from the command line,
// i.e. when we say 'node server/index.js' (or 'nodemon server/index.js', or 'nodemon server', etc)
// It will evaluate false when this module is required by another module - for example,
// if we wanted to require our app in a test spec
if (require.main === module) {
bootApp()
} else {
createApp()
}
пакет. json
"name": "57st-built-in-creator",
"version": "1.0.0",
"description": "Configurator",
"engines": {
"node": ">= 7.0.0"
},
"main": "index.js",
"scripts": {
"build-client": "webpack",
"build-client-watch": "webpack -w",
"deploy": "script/deploy",
"heroku-token": "script/encrypt-heroku-auth-token.js",
"lint": "eslint ./ --ignore-path .gitignore",
"lint-fix": "npm run lint -- --fix",
"prepare": "if [ -d .git ]; then npm-merge-driver install; fi",
"prettify": "prettier --write \"**/*.{js,jsx,json,css,scss,md}\"",
"postinstall": "touch secrets.js",
"seed": "node script/seed.js",
"start": "node server",
"start-dev": "NODE_ENV='development' npm run build-client-watch & NODE_ENV='development' npm run start-server",
"start-server": "nodemon server -e html,js,scss --ignore public --ignore client",
"test": "NODE_ENV='test' mocha \"./server/**/*.spec.js\" \"./client/**/*.spec.js\" \"./script/**/*.spec.js\" --require @babel/polyfill --require @babel/register"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js,jsx}": [
"prettier --write",
"npm run lint-fix",
"git add"
],
"*.{css,scss,json,md}": [
"prettier --write",
"git add"
]
},
"author": "57st Design",
"license": "MIT",
"dependencies": {
"@popperjs/core": "^2.3.3",
"aws-sdk": "^2.668.0",
"axios": "^0.19.0",
"bootstrap": "^4.4.1",
"compression": "^1.7.3",
"connect-session-sequelize": "^6.0.0",
"date-fns": "^2.12.0",
"express": "^4.16.4",
"express-session": "^1.15.1",
"history": "^4.9.0",
"jspdf": "^1.5.3",
"morgan": "^1.9.1",
"multer": "^1.4.2",
"multer-s3": "^2.9.0",
"passport": "^0.4.0",
"passport-google-oauth": "^2.0.0",
"pg": "^7.9.0",
"pg-hstore": "^2.3.2",
"prop-types": "^15.7.2",
"react": "^16.8.6",
"react-bootstrap": "^1.0.1",
"react-datepicker": "^2.14.1",
"react-dom": "^16.8.6",
"react-items-carousel": "^2.8.0",
"react-redux": "^7.0.1",
"react-router-bootstrap": "^0.25.0",
"react-router-dom": "^5.0.0",
"react-scrollable-list": "^1.2.0",
"react-scrolllock": "^5.0.1",
"redux": "^4.0.1",
"redux-logger": "^3.0.6",
"redux-thunk": "^2.3.0",
"sequelize": "^5.21.7",
"window": "^4.2.7"
},
"devDependencies": {
"@babel/core": "^7.4.3",
"@babel/plugin-proposal-class-properties": "7.4.0",
"@babel/plugin-proposal-decorators": "7.4.0",
"@babel/plugin-proposal-export-namespace-from": "7.2.0",
"@babel/plugin-proposal-function-sent": "7.2.0",
"@babel/plugin-proposal-json-strings": "7.2.0",
"@babel/plugin-proposal-numeric-separator": "7.2.0",
"@babel/plugin-proposal-throw-expressions": "7.2.0",
"@babel/plugin-syntax-dynamic-import": "7.2.0",
"@babel/plugin-syntax-import-meta": "7.2.0",
"@babel/polyfill": "^7.4.3",
"@babel/preset-env": "^7.4.3",
"@babel/preset-react": "^7.0.0",
"@babel/register": "^7.4.0",
"axios-mock-adapter": "^1.16.0",
"babel-eslint": "^10.0.1",
"babel-loader": "^8.0.5",
"chai": "^4.2.0",
"enzyme": "^3.9.0",
"enzyme-adapter-react-16": "^1.12.1",
"eslint": "^5.16.0",
"eslint-config-fullstack": "^6.0.0",
"eslint-config-prettier": "^4.1.0",
"eslint-plugin-react": "^7.12.4",
"git-url-parse": "^11.1.2",
"husky": "^1.3.1",
"lint-staged": "^8.1.5",
"mocha": "^6.1.4",
"nodemon": "^1.18.3",
"npm-merge-driver": "^2.3.6",
"prettier": "^1.19.1",
"react-test-renderer": "^16.4.2",
"redux-devtools-extension": "^2.13.5",
"redux-mock-store": "^1.5.3",
"simple-git": "^1.121.0",
"supertest": "^4.0.2",
"webpack": "^4.16.4",
"webpack-cli": "^3.1.0",
"yaml": "^1.6.0"
}
}