Я новичок в узле и мне интересно, двигаюсь ли я в правильном направлении, используя асинхронно/ожидание в дизайне API.
В настоящее время это только для проекта MVP, но я заинтересован в изучении хороших шаблонов.
Стек: Node, Express, MySQL (с использованием пакета mysql2)
Ниже приведена упрощенная версия моей конечной точки, которая должна дать вам представление о том, что я делаю:
createUser = async (req, res) => {
const name = req.body.name;
const email = req.body.email;
let query = 'insert into Users set name = ?, email = ?';
const values = [name, email];
query = mysql.format(query, values);
let result;
// in the project, this is abstracted
try {
const [rows] = await this.dbPool.execute(query);
// do something with the result of the query. simplified eg:
result = rows.insertId;
} catch (err) {
// handle error and assign appropriate value to result
}
res.send(result);
};
Приведенный выше код делает то, что я хочу сделать, но мне интересно, не совершаю ли я ошибку новичка таким образом, что конечная точка взаимодействует с БД укусит меня в будущем. (случай не знаю, чего я еще не знаю.) Я не ищу общих рекомендаций по кодированию (приведенный выше код упрощен), хотя они приветствуются.
Это может лучше подходить для Обзор кода.
@jonrsharpe Я отредактировал свой вопрос; надеюсь, это уменьшит то, что я ищу.
Вместо создания необработанных запросов я рекомендую вам использовать ORM. Я использую Objection.js (который использует построитель запросов Knex.js), и я так счастлив





Трудно ответить на ваш вопрос, не ознакомившись с контекстом и не увидев весь проект. Что касается async/await, если он работает, то все в порядке.
При этом всегда есть возможность сделать что-то по-другому, что может повысить гибкость и возможность повторного использования вашего кода.
Например, добавление проверки, разделение вашего экспресс-приложения на уровни, отделение логики вашего приложения от фреймворков и т. д.
Вот несколько ссылок для дополнительного чтения, если вам интересно:
https://github.com/i0natan/nodebestpractices
https://nodefunction.com/nodejs/node-js-roadmap-a-route-from-beginners-to-become-expert-developer
Весь код, который может вызвать ошибки, желательно помещать внутрь блока try.
Нет необходимости во временной переменной result. res.send(rows.insertId) можно поместить непосредственно внутрь блока try, потому что любая ошибка снаружи не будет обработана промежуточным программным обеспечением и приведет к приостановке запроса:
createUser = async (req, res) => {
try {
const name = req.body.name;
const email = req.body.email;
let query = 'insert into Users set name = ?, email = ?';
const values = [name, email];
query = mysql.format(query, values);
const [rows] = await this.dbPool.execute(query);
// do something with the result of the query. simplified eg:
res.send(rows.insertId);
} catch (err) {
// handle error and assign appropriate value to result
}
};
В остальном он уже достаточно хорош.