2016-04-02 2 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); 
    } 
}); 
} 

У меня возникла ошибка при выполнении запроса выше. Это говорит об ошибке:Результаты запроса не определены

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

Я пытался выяснить это в течение нескольких часов в настоящее время, и я подозреваю, что это несколько связанных с асинхронными значений, но я не могу понять, как это исправить.

UPDATE:

Это мой тестовый файл:

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

---------- ВТОРАЯ UPDATE после выполнения кода Zeeshan в ----------- ------- они продолжают отклонять мое редактирование в разделе комментариев.

Опять же, я попробовал ваше предложение, но все еще не было сигары. Я также напечатал «newRow», чтобы показать, что данные извлекаются должным образом, просто, когда я пытаюсь выполнить функцию res.send, он считывается как неопределенный, поэтому вызывает ошибку. Спасибо за ваше терпение!

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

Не удалось ли зарегистрировать ошибку: if (err) {console.log (err); res.send («Ошибка в запросе»);} –

+0

Если InsertId не определено, то где-то он не определяется. Я знаю, что это звучит глупо, но это проблема. Вы должны проверить, правильно ли ваш запрос, что он получает правильные данные, что он отправляет правильные данные для выбора данных и что он отправляется обратно с сервера в порядке. Поскольку у вас есть row.insertId несколько раз, мне трудно сказать, кто из них виновен. Может быть, консоль дает вам номер строки для нас? –

+0

использовать обещания для получения правильных вызовов – boomcode

ответ

0

Итак, мне удалось получить результат, который я хотел. Я закончил сравнение количества id из функции insert() вместо функции save().

описывают ('вставки()', функция() {

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

Вы должны выполнить команду return, если возникла ошибка. Самый простой способ сделать это - if(err) return res.send('Error in query');.

0

Немного изменился, можете ли вы попробовать это и обновить результаты?

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

} 
Смежные вопросы