0
votes

Just wondering if anyone can spot an issue in this code that would throw a 401 unauthorized error?

I have several similar functions, all working great, written to GET data (using axios) via the Spotify Web API, but for some reason my PUT request is throwing an error.

Here's the relevant Spotify documentation for this endpoint.

Basically, data is sent to the server from the client as an array of JSON objects with details about the tracks I'd like to save to an authorized Spotify account, along with a valid access token as a parameter. I know that the token is valid because I'm grabbing the user's account data via a different GET just prior to this step. And I know that the url is being concatenated correctly because it's being printed out in the error details:

https://api.spotify.com/v1/me/tracks?ids=5xDyeaAwdQROKqXxkGeMin%2C1Hli68AYjHPUvtF9bkr0Pe%2C2lId1EsB3LrE8rGYSBuUCy%2C0GuaEFOi9JIggdVpJulBRf%2C1ikymkBwiyQpTshPiddgRC%2C7aboHXhiWEtwft9TMAFWoK%2C3ipalmig9WXTT8KTy17OJ0%2C1twjROI1HSU0LMgP391g5l%2C0iKqQUmVOy2PEMGVhT6jBj%2C3ImgAYVk1pOeih6iFaAa0N%2C0pRzr7f2z9zHr8oqJ4Hchx%2C2racu4ScxU1gVtdpvRfUP9%2C3uoR6wF45u1W3uqAQpswg4%2C564LOaf2QQQtz2faWgWFys%2C0sO5cHkWVlwD9gv5aq1OjV%2C3WfRxX5uM7RfgqLnzftK0g%2C3yTMJDbmXKfZi0OW2g4193%2C0CdaMDNIfgQu0wR5jnXnb3%2C48ovG2U4PQPHVEosDR7lrs%2C1arM2HxLWtsCSImxVgYAzf%2C6gOl5JmXB8vUrMHo2BeeKb%2C53fBgckGdEXTQ2YhvdlGjZ%2C3tioypT6P9clCNTmThWqBL%2C2CPupwTdC35SCXCbALD7MY%2C7dKeVDydH4yqEzVNx6hui9%2C2rpJtmeLU52N5WbR7BLfUX%2C0PrZsr6FIiBu3p8uJrbFjg%2C57yUjPDCY10YUcXLhUFY4F%2C3eEe37Y0ecng4dD8awUnA7%2C0IAF0KIM3Cnp7WhOVJfFuS%2C600rxqKGJUS6gMD5klZj5l%2C24ZZPWkt2ELVI26tpiZZ1K%2C69shxYcOeyQiMJDIVlHZGE%2C6CoD3wMYARMmkjaaxiWJmZ%2C1TpTmnDAIMxvH7xIFx0zxG%2C33eI5sAdWvSGrAMW7DzWIB%2C6W9lfjN0fuvGW4nEqR9WKe%2C6kxVzbsyvnckVOIzrXrXMR%2C3I32EQp0LdVuQixucRuzq0%2C5cBR3cFJReCbjSBOarnysu%2C7zfgnI2IzmkNhQWkg1LK0u%2C5TuQeDUDFHWRFAOp8dEsn0%2C1qbcfwtK2ZhaKPnkuNdDvQ%2C5IHSXDJh9vwY9JYK39CPUx%2C3QKMflLzzaURXEcxqDXS2q%2C46Pz8LnBjGFdu19VyCPeRn%2C5rYbEHPNqqFeGQGvaw5Z0k%2C00ULB3uUHt2sR2NVkhbr59%2C0NWr0JWZmAM9A2U1U5cAn4%2C6bhWSSAQjThmnJqp2aFnaW

Any help is much appreciated!

app.put("/migration-data/put/:token", async (req, res) => {
    console.log(`Migrating data to new account using token ${req.params.token.substring(0, 4)}...\n`);
    const toClientPutData = await putData(req.params.token, req.body);
    res.json(toClientPutData);
});

const putData = async (token, data) => {
    const putResults = {};

    const spotifyAPI_PutTracks = async (trackData, index=0) => {
        try {           
            const recurse = ((trackData.length - 1) - (index + 50)) > 0;

            const offset = recurse ? 49 : (trackData.length - index) - 1;
            var tracksThisQuery = "";

            for (var i = index; i < (index + offset); i++) {
                tracksThisQuery+=`${trackData[i].id}%2C`
            }

            tracksThisQuery+=`${trackData[(index + offset)].id}`

            const puttingTracks = await axios.put(
                `https://api.spotify.com/v1/me/tracks?ids=${tracksThisQuery}`,
                { headers: { Authorization: `Bearer ${token}` } }
            );

            if (recurse) {
                return spotifyAPI_PutTracks(trackData, index+=50);
            }

            return puttingTracks.data;

        } catch (apiError) {
            console.log(apiError);
        }
    }

    const { user, savedTracks, savedAlbums, following, playlists } = data;

    if (token) {
        // put tracks
        const putTracksData = await spotifyAPI_PutTracks(savedTracks);
        putResults["putTracks"] = putTracksData;
    }

    return putResults;
}
1

1 Answers

0
votes

Figured it out - PUT expects an additional data parameter after the url, but before the headers. I just inserted an empty object literal in the second parameter slot and we're off to the races.