Search code examples
node.jsmongodbasync-awaitkoamlab

Koa js : Err: Can't set headers after they're sent. mongoDB


I'm using Koa 2's async functions.

I get the following error.

events.js:163 1:56 PM throw er; // Unhandled 'error' event 1:56 PM ^ 1:56 PM 1:56 PM Error: Can't set headers after they are sent. 1:56 PM at ServerResponse.setHeader (_http_outgoing.js:371:11) 1:56 PM at Object.set (/app/node_modules/koa/lib/response.js:440:16) 1:56 PM at Object.redirect (/app/node_modules/koa/lib/response.js:261:10) 1:56 PM at Object.proto.(anonymous function) [as redirect] (/app/node_modules/delegates/index.js:40:31) 1:56 PM Jump to at url.findOne (/app/server.js:126:9) 1:56 PM at model.Query. (/app/node_modules/mongoose/lib/model.js:3737:16) 1:56 PM at /app/node_modules/kareem/index.js:277:21 1:56 PM at /app/node_modules/kareem/index.js:131:16 1:56 PM at _combinedTickCallback (internal/process/next_tick.js:73:7) 1:56 PM at process._tickCallback (internal/process/next_tick.js:104:9) 1:56 PM 6 minutes ago

This is part of my code.

async function red(ctx) {
  let redurl = "//url here";
  url.findOne({ shortenedLink: redurl }, (err, data) => {
    //find if short url matches long url in db
    if (err) throw err;
    if (data) {
      //if matches then redirect to long url
      ctx.redirect(data.url); //getting the error here
      console.log("matched");
    } else console.error("--"); 
  });
}

My full code can be found here.


Solution

  • If you are using an async function, you should then follow the async/`await? pattern and not using callbacks. So you should rewrite your call like:

    async function red(ctx) {
      let redurl = "//url here";
      try {
          data = await url.findOne({ shortenedLink: redurl })
          if (data) {
            ctx.redirect(data.url); //getting the error here
            console.log("matched");
          } else {
            console.error("--"); 
          }
      } catch (err) {
          throw err;
      }
    }