2017-03-11 5 views
1

Aus irgendeinem verrückten Grund meiner lokalen Knoten Server arbeiten arbeitet, wenn ich mit Postbote testen, aber wenn ich zu Heroku laden bekomme ich folgende Fehlermeldung:Node.js API lokal, aber nicht auf 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

Es scheint nur eine Auszeit zu sein. Ich testete eine andere Route, nur eine normale Front-End-Route, und es lädt korrekt. Mein Code ist unten:

app.js

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

app_api/Routen

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 (Hinzufügen Controller-Code)

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

Modellmessages.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 Steckverbinderdb.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

Können Sie den Quellcode von 'ctrlMessages' posten? –

+0

Hey, ich habe den Controller-Code an der Unterseite hinzugefügt. – Kenny

+0

Haben Sie versucht, in einigen Logging-Nachrichten festzuhalten, um festzustellen, ob Code ausgeführt wird? – toddg

Antwort

0

Also das ist irgendwie komisch, aber so eine einfache Lösung:

Auszug aus db.js

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

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

Ich war eine hart codierte dbURI Variable und nicht als Umwelt aufgeführt Variable, daher hat mein Code überprüft, ob process.env.MONGOLAB_URI existiert, und es nicht.

Ich habe diese Linie einfach kommentiert und es hat perfekt funktioniert!

0

Gibt es viele Meldungen zur Produktion/Heroku-Version der API?

Ein H12 Fehlercode bedeutet, dass die Anforderung abgelaufen ist (siehe https://devcenter.heroku.com/articles/error-codes#h12-request-timeout), da Heroku ein maximales Limit von 30 Sekunden erzwingt.

Versuchen Sie, Ihren Endpunkt zu paginieren, oder geben Sie weniger Daten zurück.

+0

Hey, danke für die Antwort. Es gibt ehrlich gesagt nicht viele Daten, die herumgereicht werden, wie nur ein paar Worte. Ich habe das OP mit meinem Controller-Code aktualisiert, wenn das hilft. – Kenny

Verwandte Themen