A
A
Andrey Rudakov2021-12-22 13:28:54
Node.js
Andrey Rudakov, 2021-12-22 13:28:54

Am I writing NodeJS code correctly?

Previously, I did not write queries to the Postgresql database on NodeJS.
My code looks like this, but it seems to me that there is a more correct way:

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)
            }
        })
    })
}

In this case, there is a check for the uniqueness of the E-Mail address.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
P
Philipp, 2021-12-26
@DEMETRA-WORK

Check out 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)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question