node.js – SQLITE_MISUSE error 21 when attempting to populate database with serialize (NodeJS + Express)

may I know what the issue is with this code? I have been searching over the internet for answers but it appears that this is a new problem with SQLite3. I referenced youtube videos as well and the video creators did not face such problems.

After pulling data from an external API, I am attempting to populate the Sqlite3 database. The table has already been created but for some reason Sqlite 3 keeps complaining of a MISUSE when I have already introduced async and wait into the code for the response to complete

const sqlite3 = require("sqlite3").verbose();
const axios = require("axios");

const db = new sqlite3.Database("./mock.db", sqlite3.OPEN_READWRITE, (err) => {
  if (err) {
    return console.error(err);
  }
  console.log("Connection Successful");
});

// // For photo table creation. Comment out if not needed
// sql =
//   "CREATE TABLE photos(albumId, id, title, url, thumbnailUrl)";
// db.run(sql);

const getData = async (url) => {
  try {
    const { data } = await axios.get(url);
    data.forEach((d) => {
      let photoData = {
        albumId: d.albumId,
        id: d.id,
        title: d.title,
        url: d.url,
        thumbnailUrl: d.thumbnailUrl,
      };
      db.serialize(() => {
        db.run(
          "INSERT INTO photos (albumId, id, title, url, thumbnailUrl) VALUES(?,?,?,?,?)",
          [
            photoData.albumId,
            photoData.id,
            photoData.title,
            photoData.url,
            photoData.thumbnailUrl,
          ],
          (err) => {
            if (err) {
              console.error(err);
            } else {
              console.log("Row successfully added");
            }
          }
        );
      });
    });
  } catch (error) {
    console.log("Error");
    console.error(error);
  }
};

getData("https://jsonplaceholder.typicode.com/photos");

db.close();

The error message which I got was

Error: SQLITE_MISUSE: Database is closed
at Database.<anonymous>
at Array.forEach (<anonymous>)
    at getData 26:10)
    at processTicksAndRejections (internal/process/task_queues.js:95:5) {
  errno: 21,
  code: 'SQLITE_MISUSE',
  __augmented: true
}

Read more here: Source link