Как синхронно подключиться к серверу mssql в node.js

Все примеры использования клиентского пакета/утомительного драйвера mssql относятся к асинхронным/обратным вызовам/обещаниям, но я только разрабатываю микросервис, который будет использоваться ограниченно, и мое понимание асинхронных функций все еще немного нечеткое. Вот что у меня есть для попытки использовать async/await :

Класс формирования отчета:

    const mssql = require('mssql');
    const events = require('events');
    class reporter {
        constructor(searcher, logger) {
            // Pass in search type and value or log the error of none defined
            this.lg = logger
            if (searcher.type && searcher.content) {
                this.lg.lg("reporter created", 3)
                this.srchType = searcher.type;
                this.srchContent = searcher.content;
            } else {
                this.lg.lg("!MISSING SEARCH PARAMETERS", 0);
                this.err = "!MISSING SEARCH PARAMETERS";
            }
        }
        proc() {
            //DB Connect async
            async () => {
                try {
                    await mssql.connect('mssql://username:password@localhost/database')
                    this.result = await mssql.query`select * from mytable where id = ${this.searcher}`
                } catch (err) {
                    // ... error checks
                }
            }
            return this.result;
        }

    }

Затем позвонил:

    //Pass to reporter for resolution
    var report1 = new reporter(searcher, logs);

    report1.proc();

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

Вам это может не понравиться, но JavaScript как язык предназначен для асинхронных задач. Вы, вероятно, должны использовать это. Используйте await для имитации синхронного поведения; developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Automatico 09.04.2019 15:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 659
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не можете сделать это синхронно. Выяснение этого асинхронного материала определенно стоит вашего времени и усилий.

async/await/promises позволяют более-менее фейково делать это синхронно

const report1 = new reporter(searcher, logs);
report1.proc()
.then ( result => {
    /* in this function, "result" is what your async function returned */
    /* do res.send() here if you're in express */
} )
.catch ( error => {
    /* your lookup failed */
    /* inform the client of your web service about the failure
     * in an appropriate way. */
} )

И разверните асинхронную функцию в вашей функции proc, например:

    async proc() {
            try {
                await mssql.connect('mssql://username:password@localhost/database')
                this.result = await mssql.query`select * from mytable where id = ${this.searcher}`
            } catch (err) {
                // ... error checks
            }
        return this.result;
    }

await и .then аналогичны.

О, фейспалм, извините, это then() не next().

O. Jones 09.04.2019 17:29

Своего рода обновленный ответ, который продолжает ответ О. Джонса. Текущая версия Node.js (v15+) поддерживает ожидание верхнего уровня, что означает, что вы могу запускаете все это последовательно.

import mssql from 'mssql';
await mssql.connect('mssql://username:password@localhost/database')
const result = await mssql.query`select * from mytable where id = ${this.searcher}`

Но этого все равно следует избегать, так как вы хотите отлавливать ошибки, а не допускать их сбоя.

В текущих версиях Node.js, если ожидание/обещание отклоняется и не перехвачено с помощью .catch(), то неперехваченное обещание завершит ваше приложение с ошибкой.

Другие вопросы по теме