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

#javascript #node.js #database #microservices #node-modules

#javascript #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 amp;amp; 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();
  

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

Комментарии:

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

Ответ №1:

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

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. */
} )
  

И разверните функцию async в вашей функции 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 аналогичны.

Комментарии:

1. О, facepalm, извини, это then() не next() так.

Ответ №2:

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

 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() , то неперехваченное обещание завершит работу вашего приложения с ошибкой