в Express JS [ERR_HTTP_HEADERS_SENT]: Не удается установить заголовки после их отправки клиенту после добавления промежуточного программного обеспечения

#javascript #node.js #express

#язык JavaScript #node.js #экспресс

Вопрос:

Это мой маршрутизатор маршрута.сообщение(«/создать», isAdm ,учебники.создать); Это conroller.js

 exports.create = (req, res, bool) =gt; {  // Validate request  if (!req.body) {  res.status(400).send({  message: "Content can not be empty!"  });  }  else {  if (bool) {  let crypto = require('crypto');  let hash = crypto.createHash('md5').update(req.body.password).digest('hex');  console.log(req.body)  // Create a User  const user = new Users({  username: req.body.username,  password: hash,  fullname: req.body.fullname  });   // Save Tutorial in the database  Users.create(user, (err, data) =gt; {  if (err) {  res.status(500).send({  message:  err.message || "Some error occurred while creating the User."  });  }  else { res.send(data); }  });  }  else{  res.send("Unauthorized")  }  } };  

это модель, которую я использую

 const User = function(user) {  this.username = user.username;  this.password = user.password;  this.fullname = user.fullname; };  User.create = (newUser, result) =gt; {  sql.query("INSERT INTO users SET ?", newUser, (err, res) =gt; {  if (err) {  console.log("error: ", err);  result(err, null);  return;  }   console.log("created User: ", { id: res.insertId, ...newUser });  result(null, { id: res.insertId, ...newUser });  }); };  

Это промежуточное программное обеспечение isAdm

 const sqladminchecker = require("../db/index"); const JWTTOKEN = require('jsonwebtoken') require('dotenv') const isAdmin = (req, res, next) =gt; {  // Getting JWT from Cookies  let jwtToken: string = ''  let i: number  try {   let cookies = req.headers.cookie.split('; ')  for (i = 0; i lt; cookies.length; i  ) {  if (cookies[i].startsWith('jwt') != false) {  jwtToken = cookies[i].split('=')[1]  }  }  if (jwtToken != '') {  const jwtData = JWTTOKEN.verify(jwtToken, process.env.JWT_SECRET)  const { username, id } = jwtData  // req.id = id  sqladminchecker.query(  "SELECT * FROM users WHERE id = ? AND isAdmin = ?",  [id, 1],  (err, reslt) =gt; {  try {  if (!err) {  if (reslt.length == 1) {  next(true)  }  else {  console.log('else')  next(false)  }  }   }  catch {  console.log('catch')  next(false)   }  }    );    }  next()   }  catch {  next(false)  } } module.exports = isAdmin  

this is the console error i’m getting

созданный пользователь: { идентификатор: 15, имя пользователя: ‘dccdcdd’, пароль: ‘0fac4fe563f30f5fa080216251074ad7’, полное имя: ‘Минхазул Асиф’ } Ошибка [ERR_HTTP_HEADERS_SENT]: Не удается установить заголовки после их отправки клиенту в новом узле Ошибка (узел:внутренний/ошибки:371:5) в ServerResponse.setHeader (узел:_http_outgoing:576:11) в Ответ сервера.заголовок (/home/fahimaloy/Рабочий стол/Hospital_Project/серверная часть/node_модули/экспресс/lib/ответ.js:771:10) в ответе сервера.отправьте (/home/fahimaloy/Рабочий стол/Hospital_Project/серверная часть/node_modules/express/lib/response.js:170:12) на серверный ответ.json (/home/fahimaloy/Рабочий стол/Hospital_Project/серверная часть/node_modules/express/lib/response.js:267:15) в /home/fahimaloy/Рабочий стол/Hospital_Project/серверная часть/контроллер/пользователь.контроллер.ts:29:24 при запросе. (/home/fahimaloy/Рабочий стол/Hospital_Project/серверная часть/модели/пользователь.модель.ts:19:5) по запросу. (/home/fahimaloy/Рабочий стол/Hospital_Project/серверная часть/node_modules/mysql/lib/Соединение.js:526:10) при запросе._callback (/home/fahimaloy/Рабочий стол/Hospital_Project/серверная часть/node_modules/mysql/lib/Соединение.js:488:16) при запросе.Последовательность.конец (/home/fahimaloy/Desktop/Hospital_Project/backend/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24) { код: ‘ERR_HTTP_HEADERS_SENT’ }

это решает проблему, если я не использую промежуточное программное обеспечение «isAdm», что мне делать?

Ответ №1:

Код контроллера не ожидает переданного обратного User.create вызова, потому что вы не ждете его результата. Используйте async/await для достижения этого:

 exports.create = async (req, res, bool) =gt; { ...   // Save Tutorial in the database  try {  // if Users.create supports callbacks only you always can wrap this with Promise  const createdUser = await Users.create(user);  res.send(createdUser);  } catch (err) {  res.status(500).send({  message:  err.message || "Some error occurred while creating the User."  });  }  

Комментарии:

1. Большое спасибо. это решает проблему