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