This month, I celebrate three years in Argentina. During these three years, I've had the pleasure and pain of learning a great deal of porteƱo slang, lunfardo. I figured there was an opportunity to do a simple COVID-quarantine project to record and build on this obscure vocabulary. The first step was to build a backend.

I've called it "ismo," because that's the back-end of the word "lunfardismo."

My very simple data model defined an "Entry." Like any dictionary, you need a word, a definition, a part of speech (noun, verb, etc.). Beyond those core parts, everything else is optional, to my mind. Providing a field for a phonetic (how the word is pronounced), an example, and a language/country of origin felt like useful additions.

Tracking when a word was added and whether or not it was to be published, and generating a URL slug would be necessary for later building a UI, if I felt so inclined.

For the sake of not pasting here what you can see by visiting the repository, let's walk through a single function - to create a new Entry in the database.

I'll note that you could do this with async/await as well as promises:

// The async/await version:

exports.createEntry = async (req, res) => {
  try {
    const doc = await Models.Entry.create(req.body)
  } catch (error) {

// The promises version:

exports.createEntry = (req, res) => {
    .then(doc => {
    .catch(error => {

Models.Entry refers to the mongoose model we exported in models/index.js.

The create method returns a promise, meaning that when it is resolved or rejected we can return the response.

We create a new document passing the POST request body. That body might look like this:

  "title": "Fiaca", 
  "definition": "Laziness.", 
  "part_speech": "Noun" 

Cool. So I'll write my other functions, map endpoints to them, like so...

const router = express.Router()



module.exports = router

... and I'll have the world's simplest REST API for a dictionary app. Then I can fire up Postman or Insomnia and start testing.

Link to the full repo.

Note [July 2020]: I've already made "big" updates to the repo but the idea is always the same: model, middleware, router.