These terms sometimes confuse me on its purposes/values.

This post will make everything clear with examples.

All of their definitions can be found from official API docs.

req.url is not a native Express property, it is inherited from Node’s http module.
The req.baseUrl property is similar to the mountpath property of the app object, except app.mountpath returns the matched path pattern(s).
req.path: Contains the path part of the request URL.
req.originalUrl: This property is much like req.url; however, it retains the original request URL, allowing you to rewrite req.url freely for internal routing purposes. For example, the “mounting” feature of app.use() will rewrite req.url to strip the mount point.

Assume there are two applications: a parent app app, and a child app admin

import express from 'express'

const app = express()
const admin = express()
app.use('/admin', admin)
admin.get('/login', (req, res, next) => {
    console.log(req.url, req.originalUrl, req.baseUrl, req.path)
    res.status(200).send('login page')
})
app.get('/login', (req, res, next) => {
    console.log(req.url, req.originalUrl, req.baseUrl, req.path)
    res.status(200).send('login page')
})

app.listen(3000, () => console.log('listening'))

This is the evaluation result

Request url originalUrl baseUrl path
/login?pwd=123 /login?pwd=123 /login?pwd=123 /login
/admin/login?pwd=123 /login?pwd=123 /admin/login?pwd=123 /admin /login