2 years ago

#71593

test-img

Rylei Nathaniel

Cannot set headers after they are sent to the client, how do I stop Express from setting headers that have already been set?

I'm using Express, Node, and EJS to fetch data from Spotify Web API. Without EJS, I'm able to send a request from browser and fetch data no problem. With EJS, code crashes with code: 'ERR_HTTP_HEADERS_SENT' once I send a request in the browser. I'm lost on how to stop express from sending headers that have already been set.

const express = require("express");
const request = require("request");
const app = express();
const secret = require("./secret");
const redirect_uri = "http://localhost:8888/callback";
const client_id = secret.client_id;
const client_secret = secret.client_secret;
const querystring = require("querystring");

let state = "abc123";
let scope =
  "user-read-private user-read-email user-read-recently-played user-top-read";

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.set("view engine", "ejs");

// Request User Authorization
app.get("/login", function (req, res) {
  return res.redirect(
    "https://accounts.spotify.com/authorize?" +
      querystring.stringify({
        response_type: "code",
        client_id: client_id,
        scope: scope,
        redirect_uri: redirect_uri,
        state: state,
      })
  );
});

// Request Access Token
app.get("/callback", function (req, res) {
  let code = req.query.code || null;
  state = req.query.state || null;

  if (state === null) {
    return res.redirect(
      "/#" +
        querystring.stringify({
          error: "state_mismatch",
        })
    );
  } else {
    authOptions = {
      url: "https://accounts.spotify.com/api/token",
      form: {
        code: code,
        redirect_uri: redirect_uri,
        grant_type: "authorization_code",
      },
      headers: {
        Authorization:
          "Basic " +
          new Buffer(client_id + ":" + client_secret).toString("base64"),
      },
      json: true,
    };
  }
  // User Recently Played Tracks
  request.post(authOptions, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      let access_token = body.access_token;
      let refresh_token = body.refresh_token;
      let options = {
        url: "https://api.spotify.com/v1/me/player/recently-played",
        headers: { Authorization: "Bearer " + access_token },
        json: true,
      };

      // use the access token to access the Spotify Web API
      request.get(options, function (error, response, body) {
        let items = body.items;

        // Track Names
        for (let i = 0; i < items.length; i++) {
          let trackName = items[i].track.name;
          console.log(trackName);
        }

        // Artist Names
        for (let i = 0; i < items.length; i++) {
          let artistName = items[i].track.artists[0].name;
          console.log(artistName);
        }
      });

      // we can also pass the token to the browser to make requests from there
      return res.redirect(
        "/#" +
          querystring.stringify({
            access_token: access_token,
            refresh_token: refresh_token,
          })
      );
    } else {
      return res.redirect(
        "/#" +
          querystring.stringify({
            error: "invalid_token",
          })
      );
    }
  });
  return res.render("index");
});

// Refresh Token
app.get("/refresh_token", function (req, res) {
  let refresh_token = req.query.refresh_token;
  let authOptions = {
    url: "https://accounts.spotify.com/api/token",
    headers: {
      Authorization:
        "Basic " +
        new Buffer(client_id + ":" + client_secret).toString("base64"),
    },
    form: {
      grant_type: "refresh_token",
      refresh_token: refresh_token,
    },
    json: true,
  };

  request.post(authOptions, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      let access_token = body.access_token;
      return res.send({
        access_token: access_token,
      });
    }
  });
});

app.listen(8888, () => console.log("Server started on port 8888"));

javascript

node.js

api

express

ejs

0 Answers

Your Answer

Accepted video resources