Node.js的API在Heroku

问题描述:

在本地,但不工作的一些疯狂的原因,当我跟邮递员测试,但是当我上传到我的Heroku收到以下错误我的本地节点服务器工作:Node.js的API在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连接器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'); 
+1

你可以发布'ctrlMessages'的源代码吗? –

+0

嘿,我在底部添加了控制器代码。 – Kenny

+0

您是否试过在某些日志消息中粘贴以查看是否有任何代码正在执行? – toddg

因此,这是一种有趣的,但是这样一个简单的解决方案:

从db.js

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

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

我使用的是硬编码dbURI变量,而不是摘录其列为环境变量,因此我的代码正在检查是否存在process.env.MONGOLAB_URI,但它没有。

我只是评论说,线和完美的工作!

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

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

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

+0

嘿,谢谢你的回答。实际上并没有太多的数据被传递,就像几句话一样。如果有帮助,我已经用我的控制器代码更新了OP。 – Kenny