我的应用程序在本地运行良好,但是在Heroku上部署时,服务器(连接到数据库)没有运行。
通过阅读日志并进行SO浏览,我认为是由于以下原因:
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/shareable-todo-new')
.then((res) => console.log(res)).catch((err) => console.log(err));
我的package.json:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node ./app.js",
"dev": "nodemon ./app.js",
"heroku-postbuild":"NPM_CONFIG_PRODUCTION=false npm install --prefix front && npm run build --prefix front"
},
试图将其添加到我的package.json中,但没有帮助:
"heroku config":"set NPM_CONFIG_PRODUCTION=true"
我的app.js:
const express = require('express')
const https = require('https')
const app = express();
const bodyParser = require('body-parser')
const mongoose = require('mongoose')
const path = require('path')
const routerLists = require('./routes/lists');
const routerTasks = require('./routes/tasks')
const routerUsers = require('./routes/users')
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/shareable-todo-new', { useNewUrlParser: true, useUnifiedTopology: true })
.then((res) => console.log(res)).catch((err) => console.log(err));
// fix a deprecated bugs
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);
mongoose.Promise = global.Promise;
// Serve static assets if In Production:
app.use(bodyParser.json())
app.use('/api', routerLists)
app.use('/api', routerTasks)
app.use('/api', routerUsers)
if(process.env.NODE_ENV === 'production'){
// set static folder:
app.use(express.static(path.join(__dirname, "front/build")))
app.get("*", (req,res) => {
res.sendFile(path.resolve(__dirname, 'front', 'build', 'index.html'))
})
}
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
// middleware para admitir errores:
app.use((err,res) => {
res.status(422).send({
error: err.message
})
})
app.listen(process.env.PORT || 4000, () => console.log('express listening now...'))
如果有帮助,当我尝试执行POST请求时,chrome控制台会给出错误500
答案 0 :(得分:0)
引用127.0.0.1(或localhost)表示您的本地计算机。在Heroku上运行应用程序时,Heroku机器是127.0.0.1,其中不包含MongoDB实例。您应该使用外部服务器托管MongoDB,例如https://mlab.com/
将MongoDB部署到服务器后,将环境变量(MONGODB_URI)设置为适当的值
答案 1 :(得分:0)
在本地PC(本地主机或127.0.0.1)上进行开发和测试时,您可以在端口27017(或任何其他端口)上本地设置代码,开发环境,服务器和MongoDB实例。但是,当您将代码部署到Heroku并尝试运行您的应用程序时,Heroku肯定会引发某种错误,因为它尚未在服务器(即.herokuapp.com)上配置任何MongoDB实例。如果您找到一种创建实例非常困难的方法,那就很好了。
推荐的最佳方法是将您的应用程序连接到MongoDB云。如Oleksandr的上述回答所述,您必须在mlab或MongoDB Atlas上创建一个帐户。
将以下代码段放置在存在用于启动服务器的代码的javascript文件中。
//the following URL will be provided once you create an account on MongoDB Atlas and create
//a cluster.
mongoose.connect(`mongodb+srv://<database_user_name>:<password>@cluster.address/<db_name>?retryWrites=true&w=majority`,{
useNewUrlParser:true,
useUnifiedTopology:true //this line is not mandatory
}).then(()=>{
console.log('Connected to MongoDB Cloud :)');
})//catch errors if you want.
如果您从localhost:port在MongoDB云上开发并进行CRUD操作,其他CRUD操作应该可以正常工作,并确保您具有良好的Internet连接。
那应该有所帮助! :)