2016-04-02 12 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:

これは私のテストファイルです:Zeeshanのコードを実行した後

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

---------- SECOND UPDATE ----------- ------- コメントセクションで自分の編集を拒否し続けます。

もう一度あなたの提案を試みましたが、まだ葉巻はありません。また、データが正しく取得されていることを示すために "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( 'Error in query');} –

+0

InsertIdが定義されていない場合は、どこか定義されていません。私はそれが馬鹿に聞こえることは知っていますが、それはまさに問題です。クエリが正しいこと、適切なデータを取得していること、データを選択するために適切なデータが送信されていること、サーバーから返されていることを確認する必要があります。あなたはrow.insertIdを何度か持っているので、どちらが犯人かと言うのは難しいです。おそらく、コンソールがあなたにピンポイントのライン番号を与えているのでしょうか? –

+0

適切な呼び出しをする約束を使用 – boomcode

答えて

0

したがって、私は望んだ結果を得ることができました。私は、save()関数の代わりに、insert()関数からのidカウントを比較することになりました。

は(関数(){

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

エラーがある場合はexec 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); 
    } 
}); 

} 
関連する問題