Миналия уикенд работих върху конвертиране на моите Javascript приложения в използване на MongDB, ExpressJS, ReactJS с Redux и Node. Тъй като бях свикнал да създавам своя back-end код в Rails и всички знаем магията, която идва с Rails, исках да предизвикам себе си да създам back-end сървър и API от нулата с Node, Express и Mongo. Ето какво се случи!!

След като инсталирах необходимите пакети, започнах моето начинание в сървърния код. След като изисквах express като модул за използване, създадох приложение чрез express. Също така декларирах порт за обслужване на приложението ми. Проследих това, като извиках метод на маршрут, извлечен от един от HTTP методите, който е прикачен към моя екземпляр на express. В този случай „изпращам“ прост низ, който да се покаже на основния път „/“. Така че навигирането до localhost:3000 в моя браузър ще покаже този низ.

//server.js
const express = require('express')
const app = express()
const PORT = 3000
app.get('/', (req, res) => {
  res.send('Hire ME!')
})
app.listen(PORT, () => {
  console.log('Server running on localhost:' + PORT)
})

След като успях да обслужвам приложението си, исках да създам API за запазване на данни. MongoDB изглеждаше като обикновен инструмент за DB, така че отидох в страната на Mongo. Инсталирах необходимите пакети и направих следните промени в моя файл server.js.

Добавих зависимости на mongo и също така създадох DB за използване. Използвах MLab, за да направя DB. Използвам mongoose, за да абстрахирам някои от функциите в MongoDB, като например създаване на моя потребителска схема или модел. Свързвам се с моята база данни и регистрирам съобщението си в зависимост от успеха или неуспеха. Също така декларирам моите експресни маршрути, където ще правя GET/POST заявка.

Редът „app.use(‘/users’, userRoutes)“ означава, че всеки път, когато навигирам до localhost:3000/users, ще използвам маршрутите, декларирани в userRoutes.

//server.js
const express = require('express')
const app = express()
const mongoose = require('mongoose') // using mongoose dependency
const config = require('./db.js')
const userRoutes = require('./userRoutes.js)
const PORT = 3000
// CONNECT TO MONGO DATABASE
mongoose.connect(config.db)
mongoose.connection.on('connect', () => {
  console.log('Connected successfully')
})
mongoose.connection.on('error', () => {
  console.log('Connection failure')
})
// DECLARE ROUTES
app.use('/users', userRoutes)
app.get('/', (req, res) => {
  res.send('Hire ME!')
})
app.listen(PORT, () => {
  console.log('Server running on localhost:' + PORT)
})

Моите маршрути и модел за потребители са декларирани по следния начин. Имам нужда от схема, за да ми позволи да проектирам какъв ще бъде моят потребителски модел (засега потребителят има само поле за име). Включих и някои ограничения: уверете се, че полето за име е от тип String и че полето трябва да се изисква за зареждане в базата данни.

След това настройвам прост GET/POST маршрут за намиране/вмъкване на потребител в DB. Декларирах „/нов“ рутер и използвах синтаксис на mongo, за да намеря или вмъкна потребител в зависимост от действието, изпратено от потребителя. Така че след моите промени в server.js, когато навигирам до localhost:3000/users/new, сървърът ми ще разбере да използва маршрутите, декларирани в userRoutes.js чрез app.use(‘/users’, userRoutes).

// userRoutes.js
const mongoose = require('mongoose')
const express = require('express')
const router = express.Router()
const Schema = mongoose.Schema
const User = new Schema({
  name: {
    type: String,
    required: true
  }
})
router.get('/new', (req, res, next) => {
  User.find({"name": "James Phan"}, (err, user) => {
    res.json(user)
  })
})
router.post('/new', (req, res, next) => {
  User.insert({"name": "James Phan"}, (err, user) => {
    res.send('User saved')
  })
})
module.exports = router

И така, ето го. Прост сървър, работещ на Express, който е свързан към база данни Mongo. Разбира се, имаше допълнителен код, който оставих за краткост, като изобразяване на статични файлове, структура на папки и грешки, които идват с правенето на заявки през различни сървъри (тъй като ще се сблъскам с това, след като започна да работя върху код от страна на клиента). Като човек, който се наслаждава на програмирането в предния край, се насладих на усилията, положени в създаването на собствен сървър и API, както и на дизайнерските усилия, необходими за структурирането на този проект. Следващите стъпки сега са код от страна на клиента с React/Redux и нямам търпение какво предстои!