DEV Community

loading...

WIP => Making Sense of ORM Chaos

Keely
She/her ๐Ÿบ Rambler โœจ๐Ÿ”ฎ INFP ๐Ÿฆ‹๐ŸŒป๐Ÿ“š๐ŸตCurrently enrolled in WashU coding bootcamp ๐Ÿ’ป
ใƒปUpdated on ใƒป3 min read

Getting lost in the sauce that is setting EVERYTHING up for ORM projects.

Node.js is the language to build and talk to a server. Express is a framework to make that easier. Bootstrap is to CSS as Express is to Node.js.

I'm working through setting up an ecommerce backend by modifying starter code and configuring a working Express.js API to use Sequelize to interact with a MySQL database. S

So I'll need to do a few things in the set up.

The Set Up

Add npm files to package.json and update with name of project (include sequelize, express, dotenv, mysql2)

Look through the package json to see what's already been set up for commands to run - run seed, nodemon

npm i sequelize
npm i express
npm i dotenv
npm i mysql2
Enter fullscreen mode Exit fullscreen mode

these were all included in the code provided in wustl
Copy server file (express)
Create connection folder and copy over connection.js file
Create .env file and update db name for project

Set up database

mysql -u root -p
SOURCE schema.sql
quit
npm run seed
Enter fullscreen mode Exit fullscreen mode

run server
node server.js

The Data

When actually starting to code, we need to start by setting up the Models. But first, let's visualize the data by working our way back from Routes.

In the database, each table will require it's own model and route. These are all brought together using "index.js" located in each folder.
So the main route index pulls all the routes together under /api to be used in the server file. We are expected to get JSON back.

[localhost:3002/api]

The router folder index creates the paths for each individual route set up: /travellers, /locations, /trips.

[localhost:3002/api/travellers]

And then the Models index links together the individual models traveller, location, trip

[localhost:3002/api/:traveller]

Seeds

We were provided with Seeds which gives us an example of each data table that should be created which can then help us build the models

Models

Set up Model folder and models
Add references snippets to Models
Create model index: Product, Category, Tag, ProductTag

  1. Define columns for each column (Add validation, include decimals)
  2. Extend Product model to set up fields and rules (need to figure out where this is used and then complete)
  3. Finish model index

Validation Scaffolding:

user.init({id: {}, username:{type:, validate: {}},sequelize...});
Enter fullscreen mode Exit fullscreen mode

Indexing Models

.hasOne
Define a Driver as having one License to create a foreign key in the license table. Also define the association starting with License. If driver is deleted, cascade also deleted the associated License.

Driver.hasOne(License, {
foreignKey: 'driver_id',
onDelete: 'CASCADE'
Enter fullscreen mode Exit fullscreen mode

.belongsTo

License.belongsTo(Driver, {
foreignKey: 'driver_id',
Enter fullscreen mode Exit fullscreen mode

.hasMany
Define a Driver as having many Cars, thus creating a foreign key in the 'car' table.

Driver.hasMany(Car, {
foreignKey: 'driver_id',
onDelete: 'CASCADE', });
Car.belongsTo(Driver, {
foreignKey: 'driver_id', });
Enter fullscreen mode Exit fullscreen mode

.belongsToMany
Define the third table needed to store the foreign keys

Location.belongsToMany(Traveller, {
through: {
model: Trip,
unique: false}, 
as: 'location_travellers'});
Enter fullscreen mode Exit fullscreen mode

How to test these... run the seeds through the database.

Routes

Index has been set up for us: /categories, /products, /tags

To Dos:

  1. Category Routes & Insomnia set up
  2. Product Routes & Insomnia set up
  3. Tag Routes & Insomnia set up

GET

The purpose of the GET route is to find all the data and return as json so we can then use that data in other areas/services (ie. all locations). Can also bring in filtered data (ie. a single location).

Async Await scaffolding:

router.get('/', async (req, res) => {try{}catch(err){}}
Enter fullscreen mode Exit fullscreen mode

I started to set up my first GET route in Insomnia to test, and ran into to do item in the body-parser. This is part of express middleware that needs to be configured.

Misc. Notes

What do the different status codes mean for each?
Are we supposed to push to github with our .env file included?
add to .gitignore >> the name of that file is there so we don't need to worry about it in this project

Documentation:
https://www.npmjs.com/package/sequelize
https://www.npmjs.com/package/express
https://www.npmjs.com/package/dotenv
https://www.npmjs.com/package/mysql2

Discussion (0)