2017-03-11 58 views
1

在本地,但不工作的一些瘋狂的原因,當我跟郵遞員測試,但是當我上傳到我的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

回答

0

因此,這是一種有趣的,但是這樣一個簡單的解決方案:

從db.js

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

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

我使用的是硬編碼dbURI變量,而不是摘錄其列爲環境變量,因此我的代碼正在檢查是否存在process.env.MONGOLAB_URI,但它沒有。

我只是評論說,線和完美的工作!

0

生產/ Heroku版本的API有很多消息嗎?

H12錯誤代碼意味着請求超時(請參閱https://devcenter.heroku.com/articles/error-codes#h12-request-timeout),因爲Heroku強制執行最大限制爲30秒。

嘗試分頁您的端點,或返回更少的數據。

+0

嘿,謝謝你的回答。實際上並沒有太多的數據被傳遞,就像幾句話一樣。如果有幫助,我已經用我的控制器代碼更新了OP。 – Kenny