spooky_2020
@spooky_2020
А меня Сережа зовут.

Как лучше всего писать синхронный код в Node (для последовательных запросов к БД)?

Нужно последовательно выполнить несколько запросов к БД, каждый новый запрос зависит от результатов предыдущих.
В свое время решал это используя промисы, но получалось настолько громоздко и неудобно, что вместо Node я стал
использовать пайтон и php. Еще неудобно, что нельзя напрямую использовать this внутри connection.<methodName>()
Может сейчас уже появились более удобные способы? Подскажите куда копать/смотреть. Фрагмент кода прилагаю.
promise hell
ConstructorName.prototype.process = function() {
	const connection = mysql.createConnection({
		host: "-",
		user: "-",
		password: "-",
		database: "-"
	});
	connection.connect();

	new Promise(function (resolve, reject) {
		connection.query("SHOW TABLES", (err, results, fields) => {
			if (err) reject(err);
			results.some(item => (Object.values(item).indexOf('<tablename>') !== - 1)) 
			? resolve('таблица в порядке')
			: reject(`Таблица с именем ${'name'} не обнаружена`);
		});
	})
	.then(
		result => {
			return new Promise(function (resolve, reject) {
				connection.query(`SHOW COLUMNS FROM  <tablename>`, (err, results, fields) => {
					if (err) reject(err);
					const tableFields = results.map(item => item["Field"]);
					["<fieldname>", "<fieldname>", "<fieldname>", "<fieldname>"].every(item => tableFields.indexOf(item) !== -1)
					? resolve('Поля в порядке')
					: reject(`поле с именем ${'<fieldname>'} не обнаружено`);
				})
			})
		},
		error => { console.log(error) }
	)
	// Дальше множество аналогичного кода в .then(тоска-печаль)...
	.finally(
		() => connection.end()
	);
};
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
YuriyVorobyov1333
@YuriyVorobyov1333
Software Developer
Да, сейчас есть синтаксический сахар в виде async/await. Об этом можно прочитать здесь и здесь
ConstructorName.prototype.process = async () => {
  const connection = mysql.createConnection({
    host: "-",
    user: "-",
    password: "-",
    database: "-"
  });
  connection.connect();

  const operation = new Promise((resolve, reject) =>  {
    connection.query("SHOW TABLES", (err, results, fields) => {
      if (err) reject(err);
      results.some(item => (Object.values(item).indexOf('<tablename>') !== - 1)) 
      ? resolve('таблица в порядке')
      : reject(`Таблица с именем ${'name'} не обнаружена`);
    });
  });

  try {
    const result = await operation;

    const newOperation = new Promise(function (resolve, reject) {
      connection.query(`SHOW COLUMNS FROM  <tablename>`, (err, results, fields) => {
        if (err) reject(err);
        const tableFields = results.map(item => item["Field"]);
        ["<fieldname>", "<fieldname>", "<fieldname>", "<fieldname>"].every(item => tableFields.indexOf(item) !== -1)
        ? resolve('Поля в порядке')
        : reject(`поле с именем ${'<fieldname>'} не обнаружено`);
      })
    });

    await newOperation;
  } catch (error) {
    console.log(error);
  } finally {
    connection.end();
  }
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы