Дождитесь обратного вызова до fini sh перед выполнением следующего оператора в node js - PullRequest
0 голосов
/ 30 апреля 2020

Впервые до NodeJs. У меня проблема с синхронизацией выполнения метода. Вот что я имею в виду, у меня есть контроллер, который отвечает за: Вызов метода (в отдельном файле JS), чтобы открыть соединение с базой данных и получить данные. б. Затем он отправляет данные в интерфейс. Из моих усилий по отладке может показаться, что я отправляю данные до того, как метод, который открывает соединение и получает данные, завершается. Я знаю это, потому что, когда выполняется последняя строка salesController. js, она выдает ошибку «Не удается прочитать свойство« наборы записей »из неопределенного». В следующем фрагменте кода dbAccess. js имеет метод, который открывает базу данных и получает данные. salesController. js затем отправляет эти данные. Нужна помощь с выделенной частью в salesController. js. Обратите внимание, если это помогает, я использую sql сервер в качестве бэкэнда.

dbAccess. js

const dbConfig = require('../../nodeApp/dbConfig')

module.exports = {
    makeDBAccess: function(sqlString, req, res) {
        var sql = require("mssql/msnodesqlv8");
        // connect to your database
        sql.connect(dbConfig, function (err) {


            if (err) console.log(err);

            // create Request object
            var request = new sql.Request();

            // query to the database and get the records
            request.query(sqlString, function (err, recordset) {

                if (err) console.log(err)

                console.log(recordset.recordsets[0]);
                console.log(recordset.recordsets[0].length)

                return recordset;
            });
        });
    }
}

salesController. js

const express = require('express');
var router = express.Router();
var dbAccess = require('../utility/dbAccess.js')
var utility = require('../utility/readfile.js')


router.get('/totalSales2011', function (req, res) {
    var sqlString = utility.readFileFunc("queries/sales2011.sql");
    var recordSet = dbAccess.makeDBAccess(sqlString,req,res); **//Get data from database**
    res.send(recordSet.recordsets[0]); **//Wait for line above to complete before doing this.**
});

module.exports = router;

1 Ответ

1 голос
/ 30 апреля 2020

причина в javascript функциях возвращает undefined, если вы не добавили оператор return, функция makeDBAccess не содержит возврата, поэтому она возвращает undefined.

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

dbAccess. js

const dbConfig = require('../../nodeApp/dbConfig')

module.exports = {
    makeDBAccess: function(sqlString, callback) {
        var sql = require("mssql/msnodesqlv8");
        // connect to your database
        sql.connect(dbConfig, function (err) {


            if (err) return callback(err);

            // create Request object
            var request = new sql.Request();

            // query to the database and get the records
            request.query(sqlString, function (err, recordset) {

                if (err) return callback(err)


                return callback(null, recordset);
            });
        });
    }
}

salesController. js

const express = require('express');
var router = express.Router();
var dbAccess = require('../utility/dbAccess.js')
var utility = require('../utility/readfile.js')


router.get('/totalSales2011', function (req, res) {
    var sqlString = utility.readFileFunc("queries/sales2011.sql");
    var recordSet = dbAccess.makeDBAccess(sqlString, (err, recordSet) => {
          if (err) console.error(err);
          else res.send(recordSet.recordsets[0]);
    });

});

module.exports = router;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...