heroku无法向mlab写入数据
heroku can't write data to mlab
我有一个 node express mongodb 应用程序,它可以 运行 在我的本地机器上成功地对 mlab 进行 CRUD 操作。我可以在我的 mlab 帐户中看到添加的项目。但是当我把它推送到 heroku 时,我可以看到网站并可以访问其他所有内容,但我无法将数据保存到 mlab。几秒钟后,在控制台日志中,我收到 503(服务不可用)。
在heroku中,我也安装了mlab mongodb add-on,试了下面的代码,还是无法保存。
heroku config:add NODE_ENV=生产
这是我的config.js。 (凭据已删除以供发布)
exports.DATABASE_URL = process.env.DATABASE_URL ||
global.DATABASE_URL ||
(process.env.NODE_ENV === 'production' ?
'mongodb://localhost/local-app':
'mongodb://username:password@database.mlab.com:9999/databasename');
exports.PORT = process.env.PORT || 8080;
这是我的server.js。
var express = require('express');
var bodyParser = require('body-parser');
var jsonParser = bodyParser.json();
var mongoose = require('mongoose');
var config = require('./config');
var Item = require('./models/item');
// Mongoose Connect
var app = express();
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use(express.static('public'));
/* STEP 1 - creating objects and constructors*/
var runServer = function(callback) {
mongoose.connect(config.DATABASE_URL, function(err) {
if (err && callback) {
return callback(err);
}
console.log("Connected to mongodb!");
app.listen(config.PORT, function() {
console.log('Listening on localhost:' + config.PORT);
if (callback) {
callback();
}
});
});
};
if (require.main === module) {
runServer(function(err) {
if (err) {
console.error(err);
}
});
};
/* STEP 2 - api end points */
app.get('/items', function(req, res) {
Item.find(function(err, items) {
if (err) {
return res.status(500).json({
message: 'Internal Server Error'
});
}
res.json(items);
});
});
app.post('/items', jsonParser, function(req, res) {
console.log("req:", req.body);
if (!req.body) {
return res.sendStatus(400);
}
else {
var favoritesList = req.body;
res.status(201).json(favoritesList);
}
Item.create({
name: req.body.name,
wineResults: req.body.wineResults
},
function(err, item) {
if (err) {
//return res.sendStatus(500).json({
message: err
//});
}
else {
message: "done"
//res.sendStatus(200);
}
});
});
app.use('*', function(req, res) {
res.status(404).json({
message: 'Not Found'
});
});
/* STEP 3 - server settings*/
app.listen(process.env.PORT || 8080, process.env.IP);
exports.app = app;
exports.runServer = runServer;
非常感谢任何帮助。谢谢
我认为您的条件逻辑中有错误(在您的 config.js
中)。这是您当前的代码:
exports.DATABASE_URL = process.env.DATABASE_URL ||
global.DATABASE_URL ||
(process.env.NODE_ENV === 'production' ?
'mongodb://localhost/local-app':
'mongodb://username:password@database.mlab.com:9999/databasename');
您应该将其更改为:
exports.DATABASE_URL = process.env.MONGODB_URI || 'mongodb://localhost/local-app';
这将使您的应用程序正常运行,例如:
- 如果 运行 在本地主机上,则不应设置
MONGODB_URI
环境变量,因此您的应用程序将写入本地主机上的 mongodb。
- 如果 运行 在 Heroku 上,您将有一个
MONGODB_URI
环境变量,因此您应该使用该数据库。
您不需要对数据库的 NODE_ENV
内容做任何特别的事情——这一切都应该由您的数据库环境变量单独解决。
我有一个 node express mongodb 应用程序,它可以 运行 在我的本地机器上成功地对 mlab 进行 CRUD 操作。我可以在我的 mlab 帐户中看到添加的项目。但是当我把它推送到 heroku 时,我可以看到网站并可以访问其他所有内容,但我无法将数据保存到 mlab。几秒钟后,在控制台日志中,我收到 503(服务不可用)。
在heroku中,我也安装了mlab mongodb add-on,试了下面的代码,还是无法保存。
heroku config:add NODE_ENV=生产
这是我的config.js。 (凭据已删除以供发布)
exports.DATABASE_URL = process.env.DATABASE_URL ||
global.DATABASE_URL ||
(process.env.NODE_ENV === 'production' ?
'mongodb://localhost/local-app':
'mongodb://username:password@database.mlab.com:9999/databasename');
exports.PORT = process.env.PORT || 8080;
这是我的server.js。
var express = require('express');
var bodyParser = require('body-parser');
var jsonParser = bodyParser.json();
var mongoose = require('mongoose');
var config = require('./config');
var Item = require('./models/item');
// Mongoose Connect
var app = express();
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use(express.static('public'));
/* STEP 1 - creating objects and constructors*/
var runServer = function(callback) {
mongoose.connect(config.DATABASE_URL, function(err) {
if (err && callback) {
return callback(err);
}
console.log("Connected to mongodb!");
app.listen(config.PORT, function() {
console.log('Listening on localhost:' + config.PORT);
if (callback) {
callback();
}
});
});
};
if (require.main === module) {
runServer(function(err) {
if (err) {
console.error(err);
}
});
};
/* STEP 2 - api end points */
app.get('/items', function(req, res) {
Item.find(function(err, items) {
if (err) {
return res.status(500).json({
message: 'Internal Server Error'
});
}
res.json(items);
});
});
app.post('/items', jsonParser, function(req, res) {
console.log("req:", req.body);
if (!req.body) {
return res.sendStatus(400);
}
else {
var favoritesList = req.body;
res.status(201).json(favoritesList);
}
Item.create({
name: req.body.name,
wineResults: req.body.wineResults
},
function(err, item) {
if (err) {
//return res.sendStatus(500).json({
message: err
//});
}
else {
message: "done"
//res.sendStatus(200);
}
});
});
app.use('*', function(req, res) {
res.status(404).json({
message: 'Not Found'
});
});
/* STEP 3 - server settings*/
app.listen(process.env.PORT || 8080, process.env.IP);
exports.app = app;
exports.runServer = runServer;
非常感谢任何帮助。谢谢
我认为您的条件逻辑中有错误(在您的 config.js
中)。这是您当前的代码:
exports.DATABASE_URL = process.env.DATABASE_URL ||
global.DATABASE_URL ||
(process.env.NODE_ENV === 'production' ?
'mongodb://localhost/local-app':
'mongodb://username:password@database.mlab.com:9999/databasename');
您应该将其更改为:
exports.DATABASE_URL = process.env.MONGODB_URI || 'mongodb://localhost/local-app';
这将使您的应用程序正常运行,例如:
- 如果 运行 在本地主机上,则不应设置
MONGODB_URI
环境变量,因此您的应用程序将写入本地主机上的 mongodb。 - 如果 运行 在 Heroku 上,您将有一个
MONGODB_URI
环境变量,因此您应该使用该数据库。
您不需要对数据库的 NODE_ENV
内容做任何特别的事情——这一切都应该由您的数据库环境变量单独解决。