2016-08-08 22 views
0

Ich habe eine Datenbank auf Heroku eingerichtet und ich habe eine Tabelle namens Benutzer mit 2 Datensätzen erstellt, und jetzt versuche ich, die Daten in meine Knoten-Anwendung durch Express zu bekommen.Daten von MySql über express

Ich habe eine Verbindung wie so in meiner app.js-Datei:

// connect to the heroku database 
var mysql = require('mysql'); 
var connection = mysql.createConnection({ 
    host  : 'us-cdbr-iron-***-**.cleardb.net', 
    user  : 'bfe4***0ede74', 
    password : '6742****', 
    database : 'heroku_****ee0f0e9102' 
}); 

ich dann eine Route mit einem index.js Datei-Ordner haben:

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

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    // res.render('layout', { title: 'Movieseat' }); 

    connection.connect(); 

    connection.query('SELECT * FROM `users` WHERE `first_name` = "Kees"', function (error, results, fields) { 
     // error will be an Error if one occurred during the query 
     // results will contain the results of the query 
     // fields will contain information about the returned results fields (if any) 
     console.log(results); 
    }); 

    connection.end(); 
}); 

module.exports = router; 

In diesem Index Route Ich versuche, den Datensatz von first_name Kees zu dienen. Aber wenn ich meine Gastgeber besuchen bekomme ich folgende Fehlermeldung:

connection is not defined

ReferenceError: connection is not defined

So sieht es aus wie connection keinen Hinweis in meiner Route-Datei hat, aber in meiner WebStorm IDE, wenn ich ctrl + Klick auf die Verbindung, die ich meine App zu bekommen. js Datei wo ich meine Verbindung definiere. Wie referenziere ich die Verbindung in meiner Routendatei?

Auch wenn ich die folgende Zeile in meiner index.js Route Datei Kommentar-:

res.render('layout', { title: 'Movieseat' }); 

bekomme ich den Fehler:

Error: Can't set headers after they are sent. What would be the propper way to request data and render a jade template?

Antwort

1

Der zweite Fehler ist wahrscheinlich, weil irgendwo sind Sie fordern res .send() oder res.end() oder res.render() schon, man merkt es einfach nicht. Überprüfen Sie Ihre Middleware und so weiter, um sicherzustellen, dass Sie dies nicht tun.

Das erste Problem besteht darin, dass Sie weder das Verbindungsobjekt aus Ihrer Verbindungsdatei exportieren noch es in Ihrer Router-Datei benötigen. Sie müssen immer explizit ein Modul anfordern, um sich darauf beziehen zu können.

// connect to the heroku database 
var mysql = require('mysql'); 
var connection = mysql.createConnection({ 
    host  : 'us-cdbr-iron-***-**.cleardb.net', 
    user  : 'bfe4***0ede74', 
    password : '6742****', 
    database : 'heroku_****ee0f0e9102' 
}); 
module.exports = connection; 

beachten Sie, dass in diesem Fall, werden Sie immer die gleiche Verbindung haben, die für die Skalierbarkeit nicht groß ist. Sehen Sie sich das Verbindungspooling an und ziehen Sie in Erwägung, eine Methode zu exportieren, die die Verbindung erhält, anstatt ein globales Objekt zu übergeben.

Dann in Ihrem Router:

var express = require('express'); 
var router = express.Router(); 
var connection = require('./path/to/your/connection.js'); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    // res.render('layout', { title: 'Movieseat' }); 

    connection.connect(); 

    connection.query('SELECT * FROM `users` WHERE `first_name` = "Kees"', function (error, results, fields) { 
     // error will be an Error if one occurred during the query 
     // results will contain the results of the query 
     // fields will contain information about the returned results fields (if any) 
     console.log(results); 
    }); 

    connection.end(); 
}); 

module.exports = router; 
+1

, die nicht nach der ersten Anfrage funktionieren - mysql Verbindungen nach disconnect nicht wiederverwendbar sind, müssen Sie neue erstellen (oder keine Verbindung/Schließen in der Route-Handler oder benutze den Verbindungspool anstelle der Verbindung - die letzte Option wird bevorzugt) –

+0

Ich stimme zu, sagte ich so viel im Text, aber ich versuchte ihn konzeptionell zu starten, indem ich löste, was er verlangte. – Paul