heroku 无法将数据写入 mlab

Posted

技术标签:

【中文标题】heroku 无法将数据写入 mlab【英文标题】:heroku can't write data to mlab 【发布时间】:2017-06-05 17:14:51 【问题描述】:

我有一个 node express mongodb 应用程序,可以在我的本地机器上成功运行 CRUD 操作到 mlab。我可以在我的 mlab 帐户中看到添加的项目。但是当我将它推送到heroku时,我可以看到该网站并可以访问其他所有内容,但我无法将数据保存到mlab。几秒钟后在控制台日志中,我得到 503 (Service Unavailable)。

在heroku中,我也安装了mlab mongodb插件,试了下代码,还是无法保存。

heroku 配置:添加 NODE_ENV=production

这是我的 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;

不胜感激。谢谢。

【问题讨论】:

这段代码不是倒过来了吗?你告诉它,如果它在生产中,它应该寻找本地主机? process.env.NODE_ENV === 'production' ? 'mongodb://localhost/local-app': 'mongodb://username:password@database.mlab.com:9999/databasename' @Adam,我不确定它的顺序。我反转了它,但现在应用程序无法启动。 【参考方案1】:

我相信您的条件逻辑有错误(在您的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';

这将使您的应用程序正常运行,例如:

如果在 localhost 上运行,则不应设置 MONGODB_URI 环境变量,因此您的应用程序将写入 localhost 上的 mongodb。 如果在 Heroku 上运行,您将拥有一个 MONGODB_URI 环境变量,因此您应该使用该数据库。

您不需要为您的数据库对 NODE_ENV 做任何特别的事情 - 这一切都应该由您的数据库环境变量单独解决。

【讨论】:

我按照你的建议做了,但还是无法保存数据。 如果您从命令行运行 heroku config,您是否看到那里为您的 Mongo DB 列出了一个 DATABASE_URL 环境变量? 我看到了 BUILDPACK_URL 和 MONGODB_URI 的 URL。但没有 DATABASE_URL。 啊,那你需要把代码改成process.env.MONGODB_URI || 'mongodb://localhost/local-app';,因为你没有DATABASE_URL。 感谢更新代码,但如果我使用更新后的代码,应用程序将无法启动,并且出现应用程序错误。只有当我在 config.js 中使用我的原始代码时它才会启动。

以上是关于heroku 无法将数据写入 mlab的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 托管选项现在 Heroku mLab 附加组件正在被删除

无法从 heroku 托管的 MEAN 应用程序访问 mLab 数据库

text 将mLab添加到Heroku App

mLab 不适用于 Heroku

如果我使用 Heroku 来托管我的 d.py 机器人,它可以在 mongodb 中写入并保存到我的数据库吗?

推送通知不起作用 / Heroku-mLab