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的主要内容,如果未能解决你的问题,请参考以下文章