2017-03-11 9 views
1

Pour une raison fou mon serveur de nœud local fonctionne quand je test avec postier mais quand je télécharger sur Heroku je reçois l'erreur suivante:API Node.js travaillant localement, mais pas sur 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

Il semble juste expirer. J'ai testé une autre route, juste une route frontale normale, et elle charge correctement. Mon code est ci-dessous:

app.js

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

app_api/routes

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

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

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


module.exports = router; 

EDIT

messages.js (en ajoutant le code de commande)

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); 
     } 
    }); 
}; 

Modèlemessages.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 Connecteurdb.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

Pouvez-vous publier le code source de 'ctrlMessages'? –

+0

Hey, j'ai ajouté le code du contrôleur en bas. – Kenny

+0

Avez-vous essayé de coller dans certains messages de journalisation pour voir si l'un des codes est en cours d'exécution? – toddg

Répondre

0

C'est donc assez drôle, mais une telle solution simple:

extrait de db.js

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

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

j'utilisais une variable dbURI codée en dur et non répertorié comme un environnement variable, donc mon code vérifiait pour voir si process.env.MONGOLAB_URI existait, et ce n'était pas le cas.

J'ai simplement commenté cette ligne et cela a fonctionné parfaitement!

0

Y a-t-il beaucoup de messages sur la version production/Heroku de l'API?

Un code d'erreur H12 signifie que la demande a expiré (voir https://devcenter.heroku.com/articles/error-codes#h12-request-timeout), car Heroku impose une limite maximale de 30 secondes. Essayez de paginer votre point de terminaison ou de renvoyer moins de données.

+0

Hey, merci pour la réponse. Honnêtement, peu de données circulent, comme quelques mots. J'ai mis à jour l'OP avec mon code de contrôleur si cela aide. – Kenny