Home > database >  Express and MySql
Express and MySql

Time:10-09

When I'm sending a POST request to MySql database, it adds the product but it shoots me with that error.

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at new NodeError (node:internal/errors:387:5) at ServerResponse.setHeader (node:_http_outgoing:603:11) at ServerResponse.header (C:\Users\DELL\Desktop\Small project\node_modules\express\lib\response.js:794:10) at ServerResponse.send (C:\Users\DELL\Desktop\Small project\node_modules\express\lib\response.js:174:12) at Query. (C:\Users\DELL\Desktop\Small project\server.js:47:16) at Query. (C:\Users\DELL\Desktop\Small project\node_modules\mysql\lib\Connection.js:526:10) at Query._callback (C:\Users\DELL\Desktop\Small project\node_modules\mysql\lib\Connection.js:488:16) at Query.Sequence.end (C:\Users\DELL\Desktop\Small project\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24) at Query._handleFinalResultPacket (C:\Users\DELL\Desktop\Small project\node_modules\mysql\lib\protocol\sequences\Query.js:149:8) at Query.OkPacket (C:\Users\DELL\Desktop\Small project\node_modules\mysql\lib\protocol\sequences\Query.js:74:10) { code: 'ERR_HTTP_HEADERS_SENT'

app.post("/product", (req, res, next) => {
  let product = {
    product_title: "lool",
    product_price: 4444.12,
    product_type: "sneakers",
    product_brand: "lol",
  };
  let sql = `INSERT INTO products SET ?`;

  db.query(sql, product, (err, result) => {
    if (err) {
      throw err;
    }
    console.log(result);
    return res.send("Completed");
  });

  res.send("Added");
});

CodePudding user response:

You can only use res.send() once, when you use it a second time it throws this error. Just remove this res.send("Added").

CodePudding user response:

If you're writing asynchronous code, you must keep in mind the timing involved, and you must schedule your responses accordingly:

app.post("/product", (req, res, next) => {
  // ...
  db.query(sql, product, (err, result) => {
    // ...

    // Runs at some point in the distant future in terms of compute time
    return res.send("Completed");
  });

  // Runs *immediately*
  res.send("Added");
});

You cannot have that immediate res.send(), you must remove that. If you want to handle the error, that error handling happens inside the callback.1

--

1 This is why using async functions with await makes your code a lot easier to manage.

  • Related