DEV Community 👩‍💻👨‍💻

DEV Community 👩‍💻👨‍💻 is a community of 963,274 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
Cover image for Node.js delete File example
Tien Nguyen
Tien Nguyen

Posted on

Node.js delete File example

In this tutorial, I will show you how to delete file in Node.js with unlink & unlinkSync method using Express for Rest API.

This tutorial is from BezKoder:
https://www.bezkoder.com/node-js-delete-file/

Node.js delete File with unlink

To delete a file in Node.js, we can use the unlink() function offered by the Node built-in fs module. The method doesn't block the Node.js event loop because it works asynchronously.

Here is an illustration showing how you can apply the technique:

const fs = require('fs');

fs.unlink(directoryPath + fileName, (err) => {
    if (err) {
        throw err;
    }

    console.log("Delete File successfully.");
});
Enter fullscreen mode Exit fullscreen mode

Node.js delete File with unlinkSync

Another way to delete File in Node.js is using unlinkSync() (also provided by the Node built-in fs module). The Node.js event loop is blocked by this method until the action is finished. When you have many jobs running at once, it could harm performance.

const fs = require('fs');

try {
  fs.unlinkSync('file.txt');

  console.log("Delete File successfully.");
} catch (error) {
  console.log(error);
}
Enter fullscreen mode Exit fullscreen mode

Node.js delete File Rest API

Overview

Our Node.js Application will provide Rest API for deleting a File by its name:
DELETE /files/[filename]

This is the static folder that stores all uploaded files:

node-js-delete-file-example-folder

If you want to implement upload/download file REST APIs like this:

Methods Urls Actions
POST /upload upload a File
GET /files get List of Files (name & url)
GET /files/[filename] download a File
DELETE /files/[filename] delete a File

You can visit: Node.js File Upload/Download Rest API example

Technology

  • express 4.18.1
  • multer 1.4.4
  • cors 2.8.5

Project Structure

This is the project directory that we're gonna build:

node-js-delete-file-example-project-structure

  • resources/static/assets/uploads: folder for storing uploaded files.
  • file.controller.js exports Rest API for deleting a File with url.
  • routes/index.js: defines routes for endpoints that is called from HTTP Client, use controller to handle requests.
  • server.js: initializes routes, runs Express app.

Setup Node.js Express File Upload project

Open command prompt, change current directory to the root folder of our project.
Install Express, CORS modules with the following command:

npm install express cors

Create Controller for file delete

In controller folder, create file.controller.js:

We will export remove() and removeSync() function that:

  • use fs.unlink / fs.unlinkSync function for deleting file by its name
  • return response with message
const fs = require("fs");

const remove = (req, res) => {
  const fileName = req.params.name;
  const directoryPath = __basedir + "/resources/static/assets/uploads/";

  fs.unlink(directoryPath + fileName, (err) => {
    if (err) {
      res.status(500).send({
        message: "Could not delete the file. " + err,
      });
    }

    res.status(200).send({
      message: "File is deleted.",
    });
  });
};

const removeSync = (req, res) => {
  const fileName = req.params.name;
  const directoryPath = __basedir + "/resources/static/assets/uploads/";

  try {
    fs.unlinkSync(directoryPath + fileName);

    res.status(200).send({
      message: "File is deleted.",
    });
  } catch (err) {
    res.status(500).send({
      message: "Could not delete the file. " + err,
    });
  }
};

module.exports = {
  remove,
  removeSync,
};
Enter fullscreen mode Exit fullscreen mode

Define Route for deleting file

When a client sends HTTP requests, we need to determine how the server will response by setting up the routes.

Here is route with corresponding controller method:

  • DELETE /files/[fileName]: remove()

Create index.js file inside routes folder with content like this:

const express = require("express");
const router = express.Router();
const controller = require("../controller/file.controller");

let routes = (app) => {
  router.delete("/files/:name", controller.remove);

  app.use(router);
};

module.exports = routes;
Enter fullscreen mode Exit fullscreen mode

You can see that we use controller from file.controller.js.

Create Express app server

Finally, we create an Express server in server.js:

const cors = require("cors");
const express = require("express");
const app = express();

global.__basedir = __dirname;

var corsOptions = {
  origin: "http://localhost:8081"
};

app.use(cors(corsOptions));

const initRoutes = require("./src/routes");

app.use(express.urlencoded({ extended: true }));
initRoutes(app);

let port = 8080;
app.listen(port, () => {
  console.log(`Running at localhost:${port}`);
});
Enter fullscreen mode Exit fullscreen mode

What we do are:

  • import express and cors modules:
    • Express is for building the Rest apis
    • cors provides Express middleware to enable CORS with various options.
  • create an Express app, then add cors middlewares using app.use() method. Notice that we set origin: http://localhost:8081.
  • listen on port 8080 for incoming requests.

Run & Check

First we need to create uploads folder with the path resources/static/assets and files.

node-js-delete-file-example-folder

On the project root folder, run this command: node server.js.

Let's use Postman to make HTTP DELETE request with a file name in url:

node-js-delete-file-rest-api-example

Check the result:

node-js-delete-file-example-result

Conclusion

Today we've learned how to delete File in Node.js using unlink and unlinkSync method along with Express Rest API.

If you want to implement upload/download file REST APIs, please visit:
Node.js File Upload/Download Rest API example

Upload to GCS:
Google Cloud Storage with Node.js: File Upload example

You can also know way to upload an Excel file and store the content in MySQL database with the post:
Node.js: Upload/Import Excel file data into Database

If you want to upload images into database, you can find instructions at:

Happy Learning! See you again.

Source Code

You can find the complete source code for this tutorial on Github.

Top comments (2)

Collapse
 
lukeshiru profile image
Luke Shiru

Your examples with 2022 syntax:

import { unlink } from "node:fs/promises";
import { resolve } from "node:path";

unlink(resolve(directoryPath, fileName))
    .then(() => console.log("Delete File successfully."))
    .catch(console.error);

// or using top-level await...

try {
    await unlink(resolve(directoryPath, fileName));
    console.log("Delete File successfully.");
} catch (error) {
    console.error(error);
}
Enter fullscreen mode Exit fullscreen mode

No need to show the sync when the promise based works great. Now to the controller:

import { unlink } from "node:fs/promises";
import { resolve } from "node:path";

export const remove = ({ params }, response) =>
    unlink(
        resolve(`${__basedir}/resources/static/assets/uploads/`, params.name),
    )
        .then(() => response.status(200).send({ message: "File is deleted." }))
        .catch(error =>
            response
                .status(500)
                .send({ message: `Could not delete the file. ${error}` }),
        );
Enter fullscreen mode Exit fullscreen mode

Then the routes:

import { Router } from "express";
import { remove } from "../controller/file.controller.js";

const router = Router();

export const routes = app => {
    router.delete("/files/:name", remove);

    app.use(router);
};
Enter fullscreen mode Exit fullscreen mode

And finally the server:

import cors from "cors";
import express from "express";
import { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { routes } from "./src/routes.js";

const port = 8080;
const app = express();

// You really shouldn't do this kind of things. Using the global scope is really bad.
globalThis.__basedir = dirname(fileURLToPath(import.meta.url));

app.use(cors({ origin: `http://localhost:${port}` }));
app.use(express.urlencoded({ extended: true }));

routes(app);

app.listen(port, () => console.log(`Running at localhost:${port}`));
Enter fullscreen mode Exit fullscreen mode

You don't need to do any compilation or anything like that, you just need to set your "type" field in package.json to "module" and Tada! 🎉 You get ESM support, no more require/module.exports nonsense :D

Cheers!

Collapse
 
tienbku profile image
Tien Nguyen Author

Hi, thanks for your comment and suggestions :)

Visualizing Promises and Async/Await 🤯

async await

☝️ Check out this all-time classic DEV post