首页 > 解决方案 > 从nodejs中的数据库获取数据时的空值

问题描述

我是 nodeJS 的新手,在理解 async 和 await 的工作原理时遇到了一些问题。这是我用来从数据库中获取数据的代码:

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

我试图了解如何解决这个错误,需要做什么来等待我的查询得到结果然后打印学生数组。谁能向我解释需要做什么以及为什么它不起作用?

标签: node.jssql-serverdatabaseundefined

解决方案


因为它是异步的,所以你应该返回一个 Promise 然后返回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您的功能和awaitquery.getAllStudents()

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

推荐阅读