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

#node.js #express #hbase

#node.js #экспресс #hbase

Вопрос:

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

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

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

 _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: "/"});
        }
    });
}); 
  

Ответ №1:

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

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