Невозможно получить данные, используя mssql и hapi - PullRequest
0 голосов
/ 22 февраля 2019

Использование hapi и mssql в первый раз, и я изо всех сил пытаюсь получить данные из mssql-запроса в ответ хапи.Вот мой код:

const Boom = require('boom');
const sql = require('mssql');
const dbConfig = require('../config/sql');

module.exports = [{
        method: 'GET',
        path: '/storeInfos',
        handler: storeInfos
    }
];

function storeInfos(request, h) {
    sql.connect(dbConfig).then(() => {
            const req = new sql.Request();
            req.query('select id, name from StoreInfo').then((data) => {
                    return h.response(data);
                })
                .catch((err) => {
                    reply(Boom.badRequest(err.message, err));
                });
        })
        .catch((err) => {
            reply(Boom.badRequest(err.message, err));
        });
}

При выполнении функции / storeInfos возвращается следующая ошибка: «Ошибка: метод storeInfos не возвратил значение, обещание или не выдал ошибку.»

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

1 Ответ

0 голосов
/ 23 февраля 2019

Понял это и заставил работать с помощью await / async, благодаря этому посту Как вернуть значение из функции обещания в h.reponse .Вот рабочий код

const Boom = require('boom');
const sql = require('mssql');
const dbConfig = require('../config/sql');

module.exports = [{
        method: 'GET',
        path: '/storeInfos',
        handler: async function (request, h) {
            return await storeInfos(request, h);
        }
    }
];

async function storeInfos(request, h) {
    let pool;
    try {
        pool = await sql.connect(dbConfig)
        let data = await pool.request()
            .query('select Id, Name from StoreInfo')

        if (!data || data.recordset.length == 0) {
            throw Boom.notFound();
        }
        return h.response(data.recordset);
    } catch (err) {
        throw Boom.internal(err.message);
    } finally {
        if (pool) {
            sql.close();
        }
    }
}

Возможно, не самое элегантное решение, но оно работает.Я читал, что нет необходимости закрывать соединение с пулом, но если sql.close () не вызывается, возникает ошибка о том, что «Глобальное соединение уже существует» во второй раз, когда вызывается функция.

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