2016-04-02 13 views
1
exports.save = function(req, res) { 

connection.query('INSERT INTO student_details(name, course, units, grades, gwa) VALUES(?, ?, ?, ?, ?)',[req.body.name,req.body.course,req.body.units,req.body.grades,req.body.gwa], function(err, row) { 
    if(err) res.send('Error in query'); 
    selectOne(row.insertId, function(newRow){ 
     if(err) res.status(554).send('Error in query'); 
     if(newRow == null){ 
      res.send(552, {message: 'Student Details ('+row.insertId+') was not created.'}); 
     } else{ 
      res.status(200).send(newRow); 
     } 
    }); 
}); 

} 

var selectOne = function(id, callback){ 

connection.query('SELECT * FROM student_details WHERE id=? LIMIT 1', [id], function(err, rows){ 
    if(err) return err; 
    if(rows.length != 0){ 
     callback(rows[0]); 
    }else{ 
     callback(null); 
    } 
}); 
} 

Ich habe einen Fehler beim Ausführen der obigen Abfrage. Es ist zu sagen diesen Fehler:Abfrageergebnisse sind nicht definiert

Uncaught TypeError: Cannot read property 'insertId' of undefined.

Ich habe das jetzt stundenlang, um herauszufinden versucht, und meine Vermutung ist, dass es auf asynchrone Werte etwas verwandt ist, aber ich kann nicht herausfinden, wie es zu beheben.

UPDATE:

Dies ist mein Test-Datei:

var studentdb = require(__dirname + '/../studentdb'), 
    student = require(__dirname + '/../student'), 
    index = require(__dirname + '/../index'), 
    should = require('should-http'), 
    assert = require('assert'), 
    request = require('supertest'); 

describe('Student Details', function() { 
    var url = 'http://localhost:1337'; 
    var randomName = student.getRandomName(10); 
    var insertedId = 0; 
    describe('insert()', function() { 
    it('should create a new student record', function (done) { 
      var input = { 
       nameLength: 10, 
       subjectsLength: 5, 
       course: 'CAS' 
     }; 
     studentName = student.getRandomName(input.nameLength); 
     studentCourse = student.getRandomCourse(input.course); 
     studentUnits = student.getRandomUnits(input.subjectsLength); 
     studentGrades = student.getRandomGrades(input.subjectsLength); 
     studentGWA = student.computeGWA(studentUnits, studentGrades,input.subjectsLength); 
     var stringUnits = studentUnits.join(); 
     var stringGrades = studentGrades.join(); 
     var generatedStudent = { 
      'name': studentName, 
      'course': studentCourse, 
      'units': stringUnits, 
      'grades': stringGrades, 
      'gwa': studentGWA 
     } 
     request(url) 
      .post('/addStudent') 
      .send(generatedStudent) 
      .end(function(err, res) { 
       if (err) { 
        throw err; 
       } 
       res.should.have.status(200); 
       res.body.should.have.keys(['id', 'name', 'course','units', 'grades', 'gwa']); 
       done(); 
      }); 
     }); 
    }); 
    describe('save()', function() { 
     console.log(insertedId); 
     it('should generate a student record', function(done) { 
      request(url) 
       .get('/generateStudent') 
       .end(function(err, res) { 
        if(err) throw err; 
        res.should.have.status(200); 
        res.body.should.not.have.property('name', null); 
        res.body.should.not.have.property('course', null); 
        generatedStudent = res.body; 
        done(); 
       }); 
     }); 
     it('should not have duplicate name', function(done) { 
      request(url) 
       .get('/getStudents') 
       .end(function(err, res) { 
        if(err) throw err; 
        res.body.forEach(function(iteration) { 
         assert.notEqual(iteration, generatedStudent.name); 
        }); 
        done(); 
       }); 
     }); 
     it("now adding to the database", function(done) { 
      request(url) 
       .post('/addStudent') 
       .send(generatedStudent) 
       .end(function(err, res) { 
        if(err) throw err; 
        res.body.should.have.status(200); 
        console.log(res.body.id); 
        res.body.should.have.keys(['id', 'name', 'course', 'units', 'grades', 'gwa']); 
        done(); 
       }); 
     }); 
    }); 
}); 

---------- zweite Update nach Zeeshan Code folgenden ----------- ------- sie lehnen meine Bearbeitung im Kommentarbereich ab.

Wieder habe ich Ihren Vorschlag aber noch keine Zigarre versucht. Ich habe auch die "newRow" gedruckt, um zu zeigen, dass die Daten richtig abgerufen werden, ist es nur, dass, wenn ich die Res.Send-Funktion versuche, wird es als undefiniert gelesen und verursacht daher den Fehler. Vielen Dank für Ihre Geduld!

Server Connected on port: 1337 


    Student Details 
    insert() 
Database is connected ... nn 
If error, I should not be printed 
Value of row.insertId 34 
{ id: 34, 
    name: 'H3tno72Osk', 
    course: 'BS Computer Science', 
    units: '4,1,2,4,2', 
    grades: '3.0,3.0,3.0,3.0,4.0', 
    gwa: 3 } 
     ✓ should create a new student record (66ms) 
    save() 
     ✓ should generate a student record 
     ✓ should not have duplicate name 
     1) now adding to the database 


    3 passing (90ms) 
    1 failing 

    1) Student Details save() now adding to the database: 
    Uncaught AssertionError: expected Object { body: undefined, statusCode: undefined } to have property statusCode of 200 (got undefined) 
     at Assertion.fail (node_modules/should/lib/assertion.js:92:17) 
     at Assertion.Object.defineProperty.value [as status] (node_modules/should/lib/assertion.js:164:19) 
     at Test.<anonymous> (test/studentdb.js:86:27) 
     at Test.assert (node_modules/supertest/lib/test.js:156:6) 
     at assert (node_modules/supertest/lib/test.js:127:12) 
     at node_modules/supertest/lib/test.js:124:5 
     at Test.Request.callback (node_modules/supertest/node_modules/superagent/lib/node/index.js:691:12) 
     at IncomingMessage.<anonymous> (node_modules/supertest/node_modules/superagent/lib/node/index.js:922:12) 
     at _stream_readable.js:920:16 
+0

Können Sie den Fehler protokollieren: if (err) {console.log (err); res.send ('Fehler in der Abfrage');} –

+0

Wenn InsertId nicht definiert ist, wird es irgendwo nicht definiert. Ich weiß, das klingt albern, aber genau das ist das Problem. Sie sollten überprüfen, ob Ihre Anfrage richtig ist, dass sie die richtigen Daten erhält, dass die richtigen Daten zur Auswahl der Daten gesendet werden und dass sie vom Server zurück geschickt werden. Da Sie row.insertId mehrmals haben, ist es schwierig für mich zu sagen, welcher der Schuldige ist. Vielleicht gibt Ihnen die Konsole eine Zeilennummer, die wir genau bestimmen können? –

+0

Verwendung Versprechungen, um richtige Anrufe zu erhalten – boomcode

Antwort

0

Also, ich habe es geschafft, das Ergebnis zu bekommen, das ich wollte. Am Ende habe ich die ID-Anzahl von der Funktion insert() verglichen mit der Funktion save() verglichen.

describe ('insert()', function() {

it('should create a new student record', function (done) { 
    var input = { 
     nameLength: 10, 
     subjectsLength: 5, 
     course: 'CAS' 
    }; 
    studentName = student.getRandomName(input.nameLength); 
    studentCourse = student.getRandomCourse(input.course); 
    studentUnits = student.getRandomUnits(input.subjectsLength); 
    studentGrades = student.getRandomGrades(input.subjectsLength); 
    studentGWA = student.computeGWA(studentUnits, studentGrades, input.subjectsLength); 

    var stringUnits = studentUnits.join(); 
    var stringGrades = studentGrades.join(); 

    var generatedStudent = { 
     'name': studentName, 
     'course': studentCourse, 
     'units': stringUnits, 
     'grades': stringGrades, 
     'gwa': studentGWA 
    } 

    request(url) 
     .post('/addStudent') 
     .send(generatedStudent) 
     .end(function(err, res) { 
      if (err) { 
       throw err; 
      } 
      res.should.have.status(200); 
      insertedId = res.body.id; 
      res.body.should.have.keys(['id', 'name', 'course', 'units', 'grades', 'gwa']); 
      done(); 
     }); 
}); 

});

-1

Sie sollten return ausführen, wenn Fehler erhalten. Der einfachste Weg dazu ist if(err) return res.send('Error in query');.

0

Modifiziert ein bisschen, Können Sie dies auch versuchen und mit Ergebnissen aktualisieren?

exports.save = function(req, res) { 

connection.query('INSERT INTO student_details(name, course, units, grades, gwa) VALUES(?, ?, ?, ?, ?)',[req.body.name,req.body.course,req.body.units,req.body.grades,req.body.gwa], function(err, row) { 
    if(err) return res.send('Error in query'); 
    console.log("If Errror I should not pe printed"); 
    console.log("Value of row.insertId ", row.insertId); 
    selectOne(row.insertId, function(newRow, insertId){ 
     if(err) res.status(554).send('Error in query'); 
     if(newRow == null){ 
      res.send(552, {message: 'Student Details ('+insertId+') was not created.'}); 
     } else{ 
      res.status(200).send(newRow); 
     } 
    }); 
}); 

} 

var selectOne = function(id, callback){ 

connection.query('SELECT * FROM student_details WHERE id=? LIMIT 1', [id], function(err, rows){ 
    if(err) return err; 
    if(rows.length != 0){ 
     callback(rows[0], id); 
    }else{ 
     callback(null, id); 
    } 
}); 

} 
Verwandte Themen