нулевые значения при извлечении данных из базы данных в nodejs - PullRequest
0 голосов
/ 27 января 2019

Я новичок в nodeJS, и у меня возникли проблемы с пониманием работы асинхронных и ожидающих.Вот мой код, который я использую для получения данных из моей базы данных:

const sql = require('mssql');
const config = require('./config');
var Student = require('./student');

module.exports.getAllStudents =   async function getAllStudents(){


    var studentArray = new Array();

    console.log('dbconnection');

    var conn = new sql.ConnectionPool(config.dbConfig[0]);

    conn.connect()
    .then(()=>{

        var req = new sql.Request(conn);

        req.query('SELECT * from student').then((recordset)=> {

            var dataset = recordset.recordset;

            for(var index = 0; index<dataset.length; index++){
                var student = new Student(dataset[index].student_id , dataset[index].first_name, dataset[index].last_name, dataset[index].student_address , dataset[index].age);
                studentArray.push(student);
            }

            conn.close();

        }).catch( (error) =>{

            console.log("An error has occured while executing your query ");

            console.log(error);

        });
    })
    .catch( (error)=> {

        console.log("An error has occured while trying to connect to the database : ");

        console.log(error);

    });

    return studentArray;


}

, а вот конечная точка, где я позвонил, чтобы выбрать всех студентов:

app.get('/getAllStudents' , function(req , res){
    var studentArr = new Array();
    studentArr = query.getAllStudents();
    console.log('====================================');
    //console.log(studentArr); //this prints undefined
    //console.log('length:======' + studentArr.length);

    //var json = JSON.stringify(studentArr);

    res.status(200);
    res.send('got all students');    
})

я пытаюсьпонять, как противостоять этой ошибке, что нужно сделать, чтобы дождаться моего запроса, чтобы получить результаты, а затем распечатать массив студентов.Может ли кто-нибудь объяснить мне, что нужно сделать и почему это не работает?

1 Ответ

0 голосов
/ 28 января 2019

Поскольку он асинхронный, вы должны вернуть обещание, тогда resolve() результаты

const sql = require('mssql');
const config = require('./config');
var Student = require('./student');

module.exports.getAllStudents = function getAllStudents() {
    return new Promise((resolve, reject) => {


        var studentArray = new Array();

        console.log('dbconnection');

        var conn = new sql.ConnectionPool(config.dbConfig[0]);

        conn.connect()
        .then(()=>{

            var req = new sql.Request(conn);

            req.query('SELECT * from student').then((recordset)=> {

                var dataset = recordset.recordset;

                for(var index = 0; index<dataset.length; index++){
                    var student = new Student(dataset[index].student_id , dataset[index].first_name, dataset[index].last_name, dataset[index].student_address , dataset[index].age);
                    studentArray.push(student);
                }

                resolve(studentArray);

                conn.close();

            }).catch( (error) =>{

                console.log("An error has occured while executing your query ");

                console.log(error);

                reject(error);

            });
        })
        .catch( (error)=> {

            console.log("An error has occured while trying to connect to the database : ");

            console.log(error);

            reject(error);

        });

    });
}

Затем добавьте async к вашей функции и await к query.getAllStudents()

app.get('/getAllStudents' , async function(req , res){
    var studentArr = new Array();
    studentArr = await query.getAllStudents();
...