Nodejs и Hbase не могут устанавливать заголовки после их отправки клиенту

Недавно я начал использовать node.js и хотел бы интегрировать его с Hbase. Для этого я использовал библиотека node-hbase. Я использую экспресс для обслуживания своих запросов.

Я пытаюсь построить бизнес-логику для входа в систему пользователя, но я не могу отправить ответ пользователю. Я получаю сообщение «невозможно установить заголовок после отправки клиенту». Я дважды проверил, чтобы убедиться, что я не отправляю ответ клиенту дважды.

Ниже приведена трассировка ошибки:

_http_outgoing.js:482
throw new ERR_HTTP_HEADERS_SENT('set');
^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:482:11)
at ServerResponse.header (/Users/user/Documents/video-server/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/Users/user/Documents/video-server/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/user/Documents/video-server/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/Users/user/Documents/video-server/node_modules/express/lib/response.js:158:21)
at Row.hclient.table.row.get (/Users/user/Documents/video-server/index.js:104:15)
at client.connection.get (/Users/user/Documents/video-server/node_modules/hbase/lib/row.js:61:22)
at IncomingMessage.<anonymous> (/Users/user/Documents/video-server/node_modules/hbase/lib/connection.js:131:16)
at IncomingMessage.emit (events.js:189:13)
at Socket.socketCloseListener (_http_client.js:363:11)

Код входа можно найти ниже:

// Login
app.post('/login', (req, res) => {
    const email = req.body.email;
    const password = req.body.password;


    hclient.table('user').row(email).get('data', (error, value) => {
        if (value == null) {
            // Send to the login view
            return res.status(400).send({invalidLogin: true});
        } else {

            // Checking the password
            const hash = crypto.createHash('sha256').update(password).digest('hex');

            // Find the user password
            const userPass = value.find(function(element) {
                return element.column === "data:password";
            })["$"];

            // Check if the supplied password matches the user password
            if (hash !== userPass) {
                return res.status(400).send({invalidLogin: true})
            }

            // There is a match so we continue

            // Session setting
            // Setting the firstname
            req.session.firstname = value.find(function(element) {
                return element.column === "data:firstname";
            })["$"];

            // Setting the last name
            req.session.lastname = value.find(function(element) {
                return element.column === "data:lastname";
            })["$"];


            // Redirecting to the homepage
            return res.send({redirect: "/"});
        }
    });
}); 
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
1

Ответы 1

Ошибка была не с моей стороны, а в библиотеке node-hbase. Метод обратного вызова вызывался дважды.

Обновился до версии 0.6.0 и все работает гладко

Другие вопросы по теме