【问题标题】:Node.js API working locally but not on HerokuNode.js API 在本地工作,但不在 Heroku 上
【发布时间】:2017-08-01 15:11:25
【问题描述】:

由于某种疯狂的原因,当我使用邮递员进行测试时,我的本地节点服务器正在工作,但是当我上传到 Heroku 时,我收到以下错误:

at=error code=H12 desc="Request timeout" method=POST path="/api/messages" host=test.herokuapp.com request_id=big_number_here fwd="my_ip_address" dyno=web.1 connect=0ms service=30000ms status=503 bytes=0 protocol=https

似乎只是超时了。我测试了另一条路线,只是一条普通的前端路线,它可以正确加载。我的代码如下:

app.js

var routesApi = require('./app_api/routes/index');
app.use('/api', routesApi);

app_api/路由

var express = require('express');
var router = express.Router();

var ctrlMessages = require('../controllers/messages');

// Messages
router.post('/messages', ctrlMessages.messagesCreate);


module.exports = router;

编辑

messages.js(添加控制器代码)

var mongoose = require('mongoose');
var Msg = mongoose.model('Messages');

// mongoose.set('debug', true); // TESTING

var sendJsonResponse = function(res, status, content) {
    res.status(status);
    res.json(content);
};

/* POST a new location */
/* /api/messages */
module.exports.messagesCreate = function(req, res) {
    Msg.create({
        msg1: req.body.msg1,
        msg2: req.body.msg2
    }, function(err, msg) {
        if (err) {
            console.log(err);
            sendJsonResponse(res, 400, err);
        } else {
            console.log(err);
            sendJsonResponse(res, 201, msg);
        }
    });
};

模型 messages.js

var mongoose = require('mongoose');

var msgdata = new mongoose.Schema({
    msg1: {
        type: String,
        required: true,
    },
    msg2: {
        type: String,
        required: true
    },
    createdOn: {
        type: Date,
        "default": Date.now
    }
});

mongoose.model('Messages', msgdata);

数据库连接器 db.js

var mongoose = require('mongoose');
var gracefulShutdown;
var dbURI = 'mongodb://locationToMyMongoDB';


if (process.env.NODE_ENV === 'production') {
    dbURI = process.env.MONGOLAB_URI;
}
mongoose.connect(dbURI);

// Emulate SIGINT signal for Windows
var readLine = require('readline');
if (process.platform === "win32") {
    var rl = readLine.createInterface ({
        input: process.stdin,
        output: process.stdout
    });
    rl.on ('SIGINT', function() {
        process.emit ("SIGINT");
    });
}

mongoose.connection.on('connected', function() {
    console.log('Mongoose connected to ' + dbURI);
});
mongoose.connection.on('error', function(err) {
    console.log('mongoose connection error: ' + err);
});
mongoose.connection.on('disconnected', function() {
    console.log('Mongoose disconnected');
});

gracefulShutdown = function(msg, callback) {
    mongoose.connection.close(function() {
        console.log('Mongoose disconnected through ' + msg);
        callback();
    });
};

// For nodemon restarts
process.once('SIGUSR2', function() {
    gracefulShutdown('nodemon restart', function() {
        process.kill(process.pid, 'SIGUSR2');
    });
});
// For app termination
process.on('SIGINT', function() {
    gracefulShutdown('app termination', function() {
        process.exit(0);
    });
});
// For Heroku app termination
process.on('SIGTERM', function() {
    gracefulShutdown('Heroku app shutdown', function() {
        process.exit(0);
    });
});

// BRING IN SCHEMAS & MODELS
require('./messages');

【问题讨论】:

  • 可以发ctrlMessages的源码吗?
  • 你好,我在底部添加了控制器代码。
  • 您是否尝试过粘贴一些日志消息以查看是否有任何代码正在执行?
  • @toddg 不,但这是个好主意,我应该这样做。

标签: node.js heroku http-status-code-503


【解决方案1】:

所以这有点好笑,但这样一个简单的解决方案:

摘自 db.js

...
var dbURI = 'mongodb://locationToMyMongoDB';

if (process.env.NODE_ENV === 'production') {
    dbURI = process.env.MONGOLAB_URI;
}
...

我使用了一个硬编码的dbURI 变量并且没有将它列为环境变量,因此我的代码正在检查process.env.MONGOLAB_URI 是否存在,但它不存在。

我只是简单地评论了那条线,它工作得很好!

【讨论】:

    【解决方案2】:

    API 的生产/Heroku 版本是否有很多消息?

    H12 错误代码表示请求已超时(请参阅 https://devcenter.heroku.com/articles/error-codes#h12-request-timeout),因为 Heroku 强制执行 30 秒的最大限制。

    尝试对端点进行分页,或返回更少的数据。

    【讨论】:

    • 您好,谢谢您的回答。老实说,根本没有多少数据被传递,就像几个字一样。如果有帮助,我已经用我的控制器代码更新了 OP。
    猜你喜欢
    • 2021-07-22
    • 2021-01-30
    • 2012-04-01
    • 2023-03-17
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多