【问题标题】:[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client, expressjs[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头,expressjs
【发布时间】:2020-10-27 07:31:43
【问题描述】:

每次我尝试使用 express 的功能路由器将数据插入我的 MySQL 数据库时都会出错。似乎我的服务器尝试发送两次响应,但我不知道在哪里。 这是错误:

throw err; // Rethrow non-MySQL errors
     ^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\express\lib\response.js:771:10) 
    at ServerResponse.send (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\express\lib\response.js:170:12)   
    at ServerResponse.json (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\express\lib\response.js:267:15)   
    at Query.<anonymous> (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\src\bookingClient.js:24:36)
    at Query.<anonymous> (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\mysql\lib\Connection.js:526:10)     
    at Query._callback (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\mysql\lib\Connection.js:488:16)       
    at Query.Sequence.end (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query.ErrorPacket (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\mysql\lib\protocol\sequences\Query.js:92:8)
    at Protocol._parsePacket (C:\Users\makia\Documents\PERSO\projets\elengi\salon-user\server\node_modules\mysql\lib\protocol\Protocol.js:291:23) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

这是我的代码:

const express = require('express');

function createRouter(db) {
  const router = express.Router();

  router.post('/bookings/createbookings', (req, res, next) => {
    db.query(
          'insert into booking (idHairdresser,idClient,date,note,status,time,slot,city,address,price) values (?,?,?,?,?,?,?,?,?,?)',
        [req.body.idHairdresser, req.body.idClient, new Date (req.body.date), req.body.note, req.body.status, req.body.time, req.body.slot,req.body.city,req.body.address,req.body.price],
        (error) => {
          if (error) {
             res.status(500).json({status: 'error'});
        } else {
             res.status(200).json({status: 'ok'});
        }
      }
    );
    });

  return router;
}

module.exports = createRouter;

这是我连接数据库 expressjs 的源代码:

const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const hairdresser = require('./hairdresser');
const bookingHairdresser = require('./bookingHairdresser');
const bookingClient = require('./bookingClient');
const review = require('./review');
const prestation = require('./prestation');
const planning = require('./planning');



const connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'user',
  password : 'password',
  database : 'database'
});

connection.connect();

const port = process.env.PORT || 8080;

const app = express()
  .use(cors())
  .use(bodyParser.json())
  .use(bookingClient(connection))
  .use(hairdresser(connection))
  .use(bookingHairdresser(connection))
  .use(review(connection))
  .use(prestation(connection))
  .use(planning(connection));
  

app.listen(port, () => {
  console.log(`Express server listening on port ${port}`);
});

这是我在客户端执行的代码:

  createBookings(
    booking: Booking){
    return this.http.post(`${environment.serverUrl}/bookings/createbookings`, booking);
  }

如果您需要更多信息,我可以发送我的源代码的详细信息。提前感谢您的所有支持:)

【问题讨论】:

  • 在该代码中看不到任何特别的东西。在处理此问题之前,您在应用程序上使用了哪些其他中间件?
  • 您的代码是可靠的。你能发布调用 createRouter() 的代码吗?
  • 也许你有一个返回某些东西的中间件?

标签: javascript node.js express


【解决方案1】:

问题在于您多次发送响应。请发送源代码的详细信息,以便我研究它

【讨论】:

  • 我添加了一些细节
【解决方案2】:

这显然是中间件带你折腾的一个案例。

bookingClient.js:24中弹出错误。

唯一的可能是在 bookingClient(hairdresser, bookingHairdresser, bookingHairdresser, review, presentation & planning) 有类似路由 '/bookings/createbookings' 之后的任何路由器。

如果是,您可能希望将您的 app.js 更新为 app.use('PATH_PREFIX', bookingClient)。然后,bookingClient 中的路径将变为 'PATH_PREFIX/bookings/createbookings'。

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 2021-01-25
    • 2019-02-06
    • 2020-05-20
    • 2019-06-15
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多