Задать вопрос

Корректно ли пишу код NodeJS?

Ранее не писал запросы к базе Postgresql на NodeJS.
Мой код выглядит так, но мне кажется, что есть более корректный способ:

app.post('/register', async (req, res) => {
    let body = req.body
    let response = {status:'', title:'', text:''}
    await checkUniqueEmail(body.email).then(async function (result) {
        if (result === 0) {
            response.status = 'success'
        } else {
            response.status = 'error'
            response.title = 'E-Mail адрес занят'
            response.text = 'Используйте другой'
        }
    })
    res.json(response)
});

async function checkUniqueEmail(email) {
    return new Promise(function(resolve, reject) {
        pool.query(`SELECT * FROM users WHERE 'email' = $1`, [email], (err, result) => {
            if (err) {
                console.log(err)
            } else {
                resolve(result.rowCount)
            }
        })
    })
}

В данном случае идёт проверка на уникальность E-Mail адреса.
  • Вопрос задан
  • 147 просмотров
Подписаться 1 Простой 12 комментариев
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Посмотри knex, joi.

// Для начала разбиваем код на отдельные обработчики и храним все раздельно
// например в signup.ts
import { ERR_USER_EXISTS, ERR_USER_CREATION_FAILED } from './utils/error-codes.ts'
import { planAction, USER_CREATED } from './event-bus/rabbit.ts'
import { validateSignUpData } from './validator/signup.ts'
import { userModel } from './model/user.ts'

// собственно обработчик
export const signup = async (req, res) => {
    const { body } = req // намного удобнее использовать destructuring
    const { email, password } = body  // и const позволяет контролировать неизменность

    try {

        validateSignUpData({email, password}) // зависит от бизнес-логики

        const isUserExists = await userModel.isUserExists(email)
        if (isUserExists) {
            res.status = 400
            res.json({
                message: 'User exists',
                code: ERR_USER_EXISTS // вместо написания сообщений об ошибках
                                      // принято возвращать код ошибки
                                      // это позволяет адаптивную локализацию на фронте
                                      // этот код ошибки отличается от HTTP Status Code 
                                      // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
                                      
            })
            return
        }

        // попытаемся создать пользователя
        const userInfo = await userModel.createUser({email, password})
        if (!userInfo) {
            // в зависимости от того, как реализован createUser, он может выбрасывать исключение
            // либо возвращать пустоту
            res.status = 400
            res.json({
                message: 'User creation failed',
                code: ERR_USER_CREATION_FAILED
            })
            return
        }

        // запланируем отсылку события, обычно этот код должен быть реализован асинхронным
        // и не блокировать основной поток событий
        planAction({
            event: USER_CREATED,
            playload: userInfo
        })

        // отправим успешный ответ на фронт
        res.status = 200
        res.json(userInfo)

    } catch (e) {
        // любая ошибка, где бы она не возникла, должна быть обработана
        // в целом обычно применяется более сложная система с набором специфичных исключений 
        // и общим обработчиком ошибок
        res.status = 501
        res.json({
            message: e.message,
            code: e.code || 0
        })
    }
}


// далее в app.ts
// затем мы просто привязываем их
import { signup } from './signup.ts'
app.post('signup', signup)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы