Heroku在除主端点之外的所有端点上返回503:应用程序正在开发中



我的应用程序显示博客、用户和登录页面。

该应用程序在开发模式下完美工作

在生产模式下工作的唯一端点是一开始的登录页面。

所有其他到api/博客、api/用户等的GET和POST端点都不工作

heroku日志中的错误是H12-请求超时,出现503错误。

这是app.js

require('dotenv').config()
const config = require('./utils/config')
const express = require('express')
require('express-async-errors')
const app = express()
const mongoose = require('mongoose')
const cors = require('cors')
const morgan = require('morgan');
const middleware = require('./utils/middleware')
const blogsRouter = require('./controllers/blogs')
const usersRouter = require('./controllers/users')
const loginRouter = require('./controllers/login')
mongoose.connect(config.MONGODB_URI)
.then(() => {
console.log('connected to MongoDB')
})
.catch((error) => {
console.log('error connection to MongoDB:', error.message)
})
app.use(middleware.tokenExtractor)
app.use(cors())
app.use(express.static("build"))
app.use(express.json())
app.use('/api/blogs', blogsRouter)
app.use('/api/users', usersRouter)
app.use('/api/login', loginRouter)
app.use(middleware.errorHandler)
app.use(middleware.unknownEndpoint)
app.use(morgan(':method :url :body'));
module.exports = app

index.js

require('dotenv').config()
const app = require('./app')
const http = require('http')
const logger = require('./utils/logger')
const config = require('./utils/config')
const server = http.createServer(app)
const PORT = process.env.PORT
server.listen(PORT, () => {
logger.info(`Server running on port ${config.PORT}`)
})

控制器:

博客:

const blogsRouter = require('express').Router()
const { getNextKeyDef } = require('@testing-library/user-event/dist/keyboard/getNextKeyDef')
const Blog = require('../models/blog')
const User = require('../models/user')
const jwt = require('jsonwebtoken')
const getTokenFrom = request => {
const authorization = request.get('authorization')
if (authorization && authorization.toLowerCase().startsWith('bearer ')) {
return authorization.substring(7)
}
return null
}

blogsRouter.get('/', (request, response) => {
Blog
.find({}).populate('user', {username: 1, name: 1})
.then(blogs => {
response.json(blogs)
})
})

blogsRouter.get('/:id', async (request, response) => {
const blog = await Blog.findById(request.params.id).populate('user', {username: 1, name: 1}, ('comments', {commenter: 1, comment: 1}))
if (blog) {
response.json(blog.toJSON())
} else {
response.status(404).end()
}

})

blogsRouter.post('/', async (request, response, next) => {
const body = request.body
const token = getTokenFrom(request)
const decodedToken = jwt.verify(token, process.env.SECRET)
if (!decodedToken.id) {
return response.status(401).json({ error: 'token missing or invalid' })
}
const user = await User.findById(decodedToken.id)

if (body.title === undefined) {
return response.status(400).json({ error: 'content missing' })
}
if (body.author === undefined) {
return response.status(400).json({ error: 'content missing' })
}

const newblog = new Blog({
title: body.title,
author: body.author,
url: body.url,
user: user._id  })
const savedBlog = await newblog.save()
user.blogs = user.blogs.concat(savedBlog._id)
await user.save()
response.json(savedBlog)
})
blogsRouter.post('/:id/comments', async (request, response, next) => {
try {
const body = request.body
const blog = await Blog.findById(request.params.id)
if (blog) {
blog.comments.push(body.comment)
const savedBlog  = await blog.save()
response.status(200).json(savedBlog.toJSON());
}
} catch (exception) {
next(exception)
}})
blogsRouter.delete('/:id', async (request, response, next) => {
const decodedToken = jwt.verify(request.token, process.env.SECRET)
if (!request.token || !decodedToken.id) {
return response.status(401).json({
error: 'token missing or invalid'
})
}
try {
const blog = await Blog.findById(request.params.id)
if (blog.user.toString() === decodedToken.id.toString()) {
await blog.remove()
response.status(204).end()
} else {
response.status(401).end()
}
} catch (exception) {
next(exception)
}
})
blogsRouter.put('/:id', async (request, response, next) => {
const body = request.body
/* const decodedToken = jwt.verify(request.token, process.env.SECRET)
if (!request.token || !decodedToken.id) {
return response.status(401).json({
error: 'token missing or invalid'
})
}
const user = await User.findById(decodedToken.id) */

const blog = {
title: body.title,
author: body.author,
url: body.url,
user: body.user._id,
likes: body.likes
}

const savedBlog = await Blog.findByIdAndUpdate(request.params.id, blog, { new: true })
response.json(savedBlog)
})

module.exports = blogsRouter

登录:

const jwt = require('jsonwebtoken')
const bcrypt = require('bcrypt')
const loginRouter = require('express').Router()
const User = require('../models/user')
loginRouter.post('/', async (request, response) => {
const { username, password } = request.body
const user = await User.findOne({ username })
const passwordCorrect = user === null
? false
: await bcrypt.compare(password, user.passwordHash)
if (!(user && passwordCorrect)) {
return response.status(401).json({
error: 'invalid username or password'
})
}
const userForToken = {
username: user.username,
id: user._id,
}
const token = jwt.sign(userForToken, process.env.SECRET)
response
.status(200)
.send({ token, username: user.username, name: user.name })
})
module.exports = loginRouter

用户:

const bcrypt = require('bcrypt')
const usersRouter = require('express').Router()
const User = require('../models/user')
usersRouter.get('/', async (request, response) => {
const users = await User.find({}).populate('blogs', {title: 1, author: 1, url: 1})
response.json(users)
})
usersRouter.post('/', async (request, response) => {
const { username, name, password } = request.body
const existingUser = await User.findOne({ username })
if (existingUser) {
return response.status(400).json({
error: 'username must be unique'
})
}
if (!username) {
return response.status(400).json({
error: 'please add a username'
})
}

if (!password) {
return response.status(400).json({
error: 'please add a valid password'
})
}

const saltRounds = 10
const passwordHash = await bcrypt.hash(password, saltRounds)
const user = new User({
username,
name,
passwordHash,
})
const savedUser = await user.save()
response.status(201).json(savedUser)
})
module.exports = usersRouter

抱歉发布时间过长

如有任何帮助,将不胜感激

感谢

错误是由于Heroku未能连接到MongoDB。

MongoDB上的0.0.0.0/0白名单不起作用。

起了作用

转到Heroku中的应用程序页面--->设置--->显示配置变量

将KEY添加为MONGODB_URI,将VALUE添加为MONGODB连接字符串(在.env文件中定义(

端点在应用此更改后工作。

Heroku需要更多地强调这一步骤的重要性。