Page cover image

Web Dev Notes

Notes from Applied Internet Technology
  • Node.js
  • Web Dev
Tags
Node.js
Web Dev
Published
Sep 1, 2021
noBg
noBg

JavaScript

Variable Declaration

Properties
var
const
let
default
Scope
Function
Block
Block
Global
Updatable
Redeclarable
Hoisted
Initialized
undefined

Data Types

Primitive types

  1. number
  1. string
  1. bigInt
  1. boolean
  1. undefined
  1. symbol

Structural Types

  1. null
  1. object
  1. function

Loops / control structures

for ... in loop:

Property names of an enumerable object
  • array indices
  • object property names
const arr = ["a", "b", "c"]; arr.prop = "some prop"; for (let i in arr) { console.log(i); } // 0 1 2 prop

for ... of loop:

Property values generated by an object-specific iterator
  • array entries
  • object property values
const arr = ["a", "b", "c"]; arr.prop = "some prop"; for (let i of arr) { console.log(i); } // a b c

Higher-order Functions

ForEach

Executes callback once for each array element w/o mutation
arr.forEach(callback(currentValue[, index[, array]]) { // execute something }[, this]);

Map

Return a new array with callback executed once on each element
let newArray = arr.map(callback(currentValue[, index[, array]]) { // return element for newArray, after executing something }[, this]);

Filter

Return a new array with elements conditionally filtered
let newArray = arr.filter(callback(currentValue[, index[, array]]) { // return element for newArray, if true }[, this]);
callback - Test each element of the array. Return true to keep the element, false otherwise.
  • currentValue - The current element being processed in the array
  • index (optional) - The index of the current element being processed in the array
  • array (optional) - The array filter was called upon

Reduce

Executes a reducer function on each element ⇒ returns the accumulator after all executions
arr.reduce(callback(accumulator, currentValue, [, index[, array]] )[, initialValue])
callback- Execute on each element of the array except the 1st
  • accumulatoraccumulates callback’s return values; initialized to the 1st element
  • currentValue - The current element being processed in the array
initialValue (optional) - A value to use as the 1st argument to the initial call of callback

Object-Oriented Programming

Reference of this

Where
Code Example
What this refers to
Regular Function
function f() { console.log(this) }
the global object
Method
{a: 1, f: function() { console.log(this) }}
the object f is called on
Arrow Function
() => { console.log(this) }
this when the function is declared
Called with new
new f() { console.log(this) }
empty object returned by constructor
call/bind/apply
obj.f.call(this)
the 1st argument of call/bind/apply

Object Accessor

var person = { language : "", set lang(lang) { this.language = lang } get lang() { return this.language } getLang: function() { return this.language } }; person.lang = "en"; // invokes the setter -> set property console.log(person.lang); // invokes the getter -> property console.log(person.getLang()); // called as a function

Why Using Getters and Setters?

  • Simpler syntax
  • Equal syntax for properties and methods
  • Secure better data quality
  • Doing things behind-the-scenes

Object.defineProperty()

Creates custom getter & setters
var obj = { counter: 0 }; Object.defineProperty(obj, "increment", { get: function () { this.counter++; }, }); Object.defineProperty(obj, "subtract", { set: function (value) { this.counter -= value; }, }); obj.increment; // obj.counter == 1 obj.subtract = 2; // obj.counter == -1

Object Constructor

function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } var myFather = new Person("John", "Doe", 50, "blue"); var myMother = new Person("Sally", "Rally", 48, "green");
Cannot add new properties to an existing object constructor
Person.nationality = "English";
  • Does not affect instantiated objects

new Operator

const foo = new Foo();
Step
Implementation
1. Create a blank JS object
const foo= { } or const foo = new Object()
2. Add property __proto__
foo.__proto__ = Foo.prototype
3. Bind as this context & add properties
const ret = Foo.apply(foo, arguments)
4. Return this if the constructor doesn’t return an object
return typeof ret === 'object' ? ret : foo;

Object.create() vs new

const foo = Object.create(Foo.prototype);
Does not run the constructor function vs new

Object Prototype

Property
Where it Exists
What is It
__proto__
Instantiated Object
指向构造函数的 prototype
prototype
Object Constructor
Internal [Prototype]of an object
foo.__proto__ === Foo.prototype; foo.prototype === undefined; // does not exist on an instantance
  • Properties defined on an object’s prototype do not exist on the object itself
  • Modifying an object’s prototype affect all of its instances;

Prototype Chain

foo.__proto__.__proto__ === Object.prototype; // chaining foo instanceof Foo; foo instanceof Object; Object.prototype.__proto__ === null; // end of the chain

ES5 Syntax

Object.getPrototypeOf(obj); Object.setPrototypeOf(obj, prototype);

Functions defined on the prototype

  • When called w/ a instance: this points to the instance
  • When called on its own (on the prototype): this points to the global object

Classes (ES6 Syntax)

// Declaration class Rectangle { constructor(height, width) { this.height = height; this.width = width; } get area() { // Getter return this.calcArea(); } calcArea() { // Method return this.height * this.width; } static displayName = "rect"; // static property static calcArea(height, width) { return height * width; } } class Button extends Rectangle { constructor(height, width, func) { super(height, width); this.func = func; } click() { this.func(); } }

Closure / Scope in JS

Every scope in JS has live access to variables in the outer scope
  • Inner functions have access to variables in the outer function even after the outer function terminated
Usage
  • Create private scopes w/ true private variables
    • Variables in a closure can only be modified by functions in the same scope
  • Access outer variable in a callback function
    const getData = (url) => { return fetch(url).then(() => console.log(url)); };

    Functions

    Decorators

    function decorator(func) { return function (...args) { doSomething(func(...args)); }; }

    Hoisting

    var
    function

    Using Callback Functions

    The problem of losing context & its solutions:

    Methods on Functions

    bind
    apply
    call

    Arrow Functions

    Chaining
    const f1 = cb => x => cb(x) + 1 // equivalent to function f1(cb) { return function f2(x) { return cb(x) + 1 } } // call f1(Math.sqrt)(4) = Math.sqrt(4) + 1 = 3
    Where this keyword points to
    Where not to use arrow functions

    Modules

    File IO: fs module

    Async in JS

    单线程:JS 的 V8 引擎中负责解释和执行 JavaScript 代码的线程只有主线程
    同步:函数 A 返回时,调用者能够得到预期结果
    异步:函数 A 返回时,调用者不能立即得到结果

    Using Callback Functions

    fs.readFile("foo.txt", "utf8", function (err, data) { console.log(data); });
    • 返回后会通知callback进行接下来的操作
    • 非阻塞:拿到结果前不会阻塞其他代码的运行
    • 工作线程在异步操作完成后需要通知主线程

    消息队列和事件循环

    消息队列:消息队列是一个先进先出的队列,它里面存放着各种消息
    事件循环:事件循环是指主线程重复从消息队列中取消息、执行的过程。
    • 一次循环 = 主线程从消息队列取一个消息并执行的过程
    notion image
    preview
    => 异步过程的回调函数,一定不在当前这一轮事件循环中执行。
    DOM 事件:触发通过addEventListener()添加的事件监听器
    button.addEventListener("click", callback);
    用户点击按钮 –> 触发 click 事件 –> 将callback封装成消息放入队列 –> 主线程执行callback

    Promise

    A solution to resolving sync & async requests / callback hell
    const calculate = (a, b) => new Promise((resolve, reject) => { let sum = a + b; if (isNaN(sum)) { reject("failed"); } else { resolve("success"); } }); calculate .then((number) => { console.log("Then", number); }) .catch((number) => { console.log("Catched", number); });

    Promise.all([promise1, promise2])

    Run all promises in parallel; move to .then when ALL are resolved

    Promise.race([promise1, promise2])

    Run all promises in parallel; move to .then when ANY is resolved

    A+规范

    async/await 语法糖

    async function logSum(a, b) { const sum = await calculate(a, b); console.log(sum); }

    消息范式:观察者/订阅-发布

    notion image
    img

    Front-End

    浏览器事件

    immutable.js

    开发模式

    MVVM

    Model (数据层):数据和业务逻辑
    View (视图层):UI/数据的展示
    ViewModel (监听层):监听Model中数据的改变,更新View层 “Model of View”
    notion image
    mvvm

    MVC

    graph LR C(Controller<br/>业务逻辑) M(Model<br/>数据持久) V(View<br/>用户界面) U(["用户"]) U--输入-->V V--传输指令--> C C --"选取&处理数据"--> M M --提供数据--> V

    HTML

    Elements

    Void elements

    Does not have content
    area, base, br, col, embed, hr, img, input, link, meta, param, source, track, wbr

    The template element

    template

    Raw text elements

    script, style

    Escapable raw text elements

    textarea, title

    Foreign elements

    Elements from the MathML namespace and the SVG namespace.

    Normal elements

    All other allowed HTML elements are normal elements.

    Form

    <form method="POST" action="/path"> <input type="hidden" value="{crsf_token}" /> hidden from views <input type="text" value="" /> text input field <input type="submit" /> the submit button </form>

    CSS

    Units

    Pseudo Elements

    ::before, ::after

    Insert html elements before / after
    Can have their content defined to be an html element

    Web

    URL

    notion image

    TCP/IP

    notion image
    A stack of protocols
    1. Application Layer: application level (HTTP, SMTP, etc.)
    1. Transport Layer: communication between applications (TCP, UDP)
    1. Network Layer: routing packets of data across network boundaries (IP)
    1. Physical / Link Layer: convert data to network signal & v.v.
     

    TCP vs UDP

    TCP 传输控制协议
    UDP 用户数据报协议
    Transmission control protocol
    User data protocol
    Guarantee data delivered is contact & in correct order
    Do not guarantee data delivery
    Slower
    Faster

    连接建立阶段:三次握手

    第一次
    C→S
    C 应用进程主动打开,发出请求报文:
    SYN=1,seq=x
    第二次
    S→C
    S 应用进程被动打开,若同意请求,发回确认报文:
    SYN=1,ACK=1,ack=x+1,seq=y
    第三次
    C→S
    C 收到确认报文后,通知上层应用进程连接已建立,发出确认报文:
    ACK=1,ack=y+1
    S 收到 C 的确认报文后,通知其上层应用进程连接已建立。

    连接释放阶段:四次挥手

    第一次
    C→S
    C 应用进程发出连接释放报文段,停止发送数据
    FIN=1,seq=u
    第二次
    S→C
    S 确定收到释放报文,发出确认报文。 ⇒ 连接进入半关闭状态,C 不再发送数据。
    ack=u+1,seq=v
    第三次
    S→C
    S 若没有要发送的数据,应用进程通知服务器释放 TCP 连接。S 发出最后一个报文:
    FIN=1,ACK=1,seq=w,ack=u+1
    第四次
    C→S
    C 收到连接释放报文段之后,发出确认:经过 2MSL(最长报文端寿命)后,TCP 连接结束
    ACK=1,seq=u+1,ack=w+1

    Connection / Disconnection Diagram

    notion image

    OIS Model

    notion image
    OSI 七层网络模型
    TCP/IP 四层概念模型
    对应网络协议
    应用层(Application)
    应用层
    HTTP、TFTP, FTP, NFS, WAIS、SMTP
    表示层(Presentation)
    Telnet, Rlogin, SNMP, Gopher
    会话层(Session)
    SMTP, DNS
    传输层(Transport)
    传输层
    TCP, UDP
    网络层(Network)
    网络层
    IP, ICMP, ARP, RARP, AKP, UUCP
    数据链路层(Data Link)
    数据链路层
    FDDI, Ethernet, Arpanet, PDN, SLIP,PPP
    物理层(Physical)
    IEEE 802.1A, IEEE 802.2 到 IEEE 802.11

    HTTP

    Request

    notion image

    Methods

    Idempotent 幂等:请求无副作用,发送同样的请求一定会收到同样的响应 (幂等 -> 安全)
    方法
    描述
    请求体
    响应体
    幂等
    安全
    缓存
    GET
    获取指定资源
    HEAD
    GET 但只获取响应头部
    POST
    提交数据
    PUT
    替换指定资源
    DELETE
    删除指定资源
    CONNECT
    将连接改为tunnel
    OPTIONS
    描述通信选项(预检请求)
    TRACE
    回显服务器收到的请求
    PATCH
    对已知资源进行局部更新

    Form

    GET
    POST
    Payload Location
    URL query string
    HTTP request body
    Repeat on refresh
    Usage
    Filtering / search
    Creating resource

    Response

    notion image

    Status Code

    状态码
    状态码英文名称
    中文描述
    200
    OK
    请求成功。一般用于 GET 与 POST 请求
    201
    Created
    已创建。成功请求并创建了新的资源
    202
    Accepted
    已接受。已经接受请求,但未处理完成
    301
    Moved Permanently
    永久移动。请求的资源已被永久的移动到新 URI,返回信息会包括新的 URI,浏览器会自动定向到新 URI。今后任何新的请求都应使用新的 URI 代替
    302
    Found
    临时移动。与 301 类似。但资源只是临时被移动。客户端应继续使用原有 URI
    304
    Not Modified
    未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
    307
    Temporary Redirect
    临时重定向。与 302 类似。使用 GET 请求重定向
    400
    Bad Request
    客户端请求的语法错误,服务器无法理解
    401
    de
    请求要求用户的身份认证
    403
    Forbidden
    服务器理解请求客户端的请求,但是拒绝执行此请求
    404
    Not Found
    服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置“您所请求的资源无法找到”的个性页面
    405
    Method Not Allowed
    客户端请求中的方法被禁止
    408
    Request Time-out
    服务器等待客户端发送的请求时间过长,超时
    409
    Conflict
    服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
    500
    Internal Server Error
    服务器内部错误,无法完成请求
    501
    Not Implemented
    服务器不支持请求的功能,无法完成请求
    502
    Bad Gateway
    作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应

    Headers

    • Content-Type
    • Set-Cookie
    • Cookie
    • Location

    Demo HTTP Server

    const net = require(`net`); const server = net.createServer(handleConenct); function handleConnect(data) {} function handleData(sock, data) {} server.listen(PORT);

    Storage

    Cookie
    Session Storage
    Local Storage
    Capacity
    4kb
    5mb
    10mb
    Where accessible
    Any window
    Same tab
    Any window
    Expiration
    Manually set
    On tab close
    Never
    Location
    Browser & server
    Browser only
    Browser only
    Sent w/ Request
    Yes
    No
    No

    Cookie

    A small piece of data a server sends to the client browser

    Cookie Creation

    Set-Cookie Response Header Instructs the browser to create a cookie

    Content

    • Data: name1=value pairs desperate by ;
    • Expiration: how long the cookie is valid for
    -
    Security options
    Description
    Domain
    Cookies sent will only be valid for this domain (default is current domain)
    Path
    Cookies sent will only be valid for this path (default is all paths)
    HttpOnly
    Only allow reading of cookies via http & disable JS (3rd party JS is by default allowed to read cookies for that domain)
    Secure
    Cookies will only be sent if the request is encrypted (using TLS/SSL)
    HttpOnly & Secure are necessary in almost all cases

    Properties

    • Multiple Set-Cookie is allowed in one response
    • Only data will be sent back to the server in a http request
    • A server cannot force the browser to delete cookies; expiration is only expected to work

    Cookie Types

    Session Cookies

    Deleted when the client is shut down

    Permanent Cookies

    Only expires at certain date / after a period of time

    Expires(date)

    Set-Cookie: foo=bar; Expires=Thu, 29 Oct 2016 07:28:00 GMT;

    Max-Age

    Set-Cookie: foo=bar; Max-Age=300;

    Session

    Usage

    Maintain “state” between requests

    • Authentication
    • Store persistent data
    • Visits, user preference, tracking, etc.

    Store data on the server about a user

    • Use session ID to identify / represent the user

    Link the data to the requests from a particular client

    • Session ID retransmitted on every request from the same client

    Session ID

    The identifier used to represent a session owned by a client

    Security Issue: Owning session ID = Owning the session

    ⇒ secure generation (non-sequential)
    ⇒ shouldn’t be present in query string
    ⇒ adequately long / complex

    Session Creation & Use

    1. Server generates session id for an http request
    1. Server sets client’s cookie with the session ID in the http response
    1. Client creates / updates a cookie tied to the domain
    1. Client sends the cookie w/ every request
    1. Server finds the session according to the ID received

    Session Store

    Location where the server stores the sessions data
    Location: in-memory / file-based / database

    Cache

    Cross-origin

    Same Origin Policy 同源策略

    浏览器端的安全机制
    同源:协议、域、端口相同
    • DOM 同源策略:禁止对不同源页面进行 DOM 操作
    • XMLHttpRequest 同源策略:拦截向不同源服务器地址的请求的回应
    防范的攻击
    • 访问 iframe 内容
    • CRSF
    允许的跨域资源访问
    • JavaScript: <script> 标签
    • CSS: <link rel="stylesheet" href="styles.css">
    • 图片:<img src="pic.png">

    1. JSONP: 跨域 GET 请求

    用 JS 包装的数据
    • HTML 中的<script scr="">, <img src="">, <link rel="a.css">标签可以发送跨域请求
    请求:query string 包括 callback function 的名字
    <script> function jsonpCallback(response) { console.log("jsonp response", response); } </script> <script type="text/javascript" src="/api?callback=jsonpCallback"></script>
    响应:包裹着数据的 callback function
    jsonpCallback(JSON.stringify(data));
    收到后会被<script>标签立即执行

    2. 空iframeform: 跨域 POST 请求

    1. 创建一个 POST form,target设置为‘some-target’
    1. 创建一个nameformtarget一致的iframesrc可以留空
      1. <form id="form1" action="" target="target1" method="post"></form> <iframe id="xxx" name="target1" src=""></iframe>
    1. 通过 JS 来 submit 这个 form
      1. $("#form1").attr("action", "url"); $("#form1").submit();

    3. Cross-Origin Resource Sharing 跨域资源共享 (CORS)

    notion image

    简单请求

    请求方法为:HEAD, GET, POST
    请求头仅包含:
    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于 application/x-www-form-urlencoded、multipart/form-data、text/plain

    流程

    1. Client 发送请求
    1. Server 判断请求源是否安全
      • 安全:发送响应头包含Access-Control-Allow-Origin: origin-of-request的响应
      • 不安全:发送普通的响应
      1. Client 浏览器会拦截没有Access-Control-Allow-Origin的响应
      img

      非简单请求

      必须首先使用 OPTIONS方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。

      流程

      1. Client 发送OPTIONS预检请求
        1. OPTIONS /resources/post-here/ HTTP/1.1 ... Origin: http://foo.example Access-Control-Request-Method: POST (实际请求的方法) Access-Control-Request-Headers: X-PINGOTHER, Content-Type (自定义的请求头)
      1. Server 回复预检请求
        1. HTTP/1.1 200 OK ... Access-Control-Allow-Origin: http://foo.example Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400 (表明该响应的有效时间为86400秒 / 24小时)
      1. Client 发送实际请求:包含自定义的请求头和 payload
      1. Server 响应实际请求
        1. HTTP/1.1 200 OK ... Access-Control-Allow-Origin: http://foo.example [payload]

      附带身份凭证的请求

      4. 代理

      Back-end

      Express

      ✅ ​Routing
      ✅ Templating
      ✅ Request/ Response objects
      ❌ Authentication
      ❌ Database / object-relational mapper
      ❌ Dictate project layout

      Routing

      Express Routing - Route Parameters
      app.all("/"); // handle all request methods

      Path Matching

      Path String
      Matches
      ‘/ab?cd’
      /acd and /abcd
      ‘/ab+cd’
      /abcd, /abbcd, /abbbcd, and so on
      ‘/ab*cd’
      anything between /ab cd
      ‘/ab(cd)?e’
      /abe and /abcde
      /a/
      anything witha in it (regex)

      Route Parameters

      app.get("/users/:userId/books/:bookId", function (req, res) { res.send(req.params);});

      Middlewares

      Serving Static files

      function serveStatic(req, res, next) { fs.readFile(`public/${req.path}`, (err, data) => { if (err) { next(); } else { res.send(data); } }); }

      Body Parsers

      Populate req.body with name:value pairs parsed from the request body
      express.json([options]);
      • parses incoming requests with JSON payloads
      express.urlencoded({ extended: false });
      • parses incoming requests with urlencoded payloads
        • Original Body: field1=value1&field2=value2
        • Parsed Body:req.body = { field1: value1, field2: value2

      Session middleware

      const session = require(`express-session`); app.use( session({ secret: `string`, // encrypt the session ids -> long & complex saveUninitialized: false, // don't save new empty session resave: false, // not to resave unmodified session data }) );
      Creates a req.session object that persists between requests

      Form handling

      GET form

      app.get(`/form`, (req, res) => { console.log(req.query); });

      POST form

      app.use(express.urlencoded({ extended: false })); // body parser middleware to decode app.post(`/form`, (req, res) => { req.body; });

      Request Object

      req.query
      req.header
      req.ip
      req.path
      req.method
      req.cookie
      req.params: object w/ keys-value pairs of what’s after : in the path
      app.get(`/foo/:bar`, (req, res) => { console.log(req.params.bar); });

      Response Object

      res.send()
      res.status(<status code>).send(<data>)
      res.set(<header>)

      Handlebars (hbs) templating

      public
      static files
      src
      app.js
      views
      .hbs template files ~ html webpages layout.hbs - the default html rendered by every call on res.render() - 1st parameter of res.render() = location of the hbs file layout.hbs’s body

      Loop

      <ul> {{#each people}} <li>{{this}}</li> {{/each}} </ul>

      Condition

      <div> {{#if author}} <h1>{{firstName}} {{lastName}}</h1> {{/if}} {{#unless license}} <h1>WARNING: No license!</h1> {{/unless}} </div>

      Files Structure

      /views/ layout.hbs - default template to render
      somethingElse.hbs - can be used in render() to fill the body of layout.hbs

      REST API

      目的
      请求方法
      Route 格式
      Create a new entry
      POST
      /tasks
      Delete an existing entry
      DELETE
      /tasks/:id
      Query all existing entries
      GET
      /tasks/
      Query one specific entry
      GET
      /tasks/:id
      Modify an existing entry
      PUT/PATCH
      /tasks/:id

      koa.js

      Onion-style middleware
      • Pre-processing
      • Post-processing

      Database

      Types of Database

      Relational

      Organize data in tables
      • Rows & columns
      • Can have customizable & complicated constraints
      • A bit rigid
      • Tables can link / refer to each other

      Non-relational

      • Constraints are not implemented by default
      • Doesn’t model data using tables & relations
      • Document-Object Mapper

      MongoDB

      Non-relational database
      Lightweight & suitable for client-side-heavy web apps
      • A lot more flexible

      Properties

      Do not need to create / initialize before using
      No constraints on properties
      • Logic for constraints, data integrity rules should go in application layer

      Structure

      • DBMS -> DB -> Collection -> Document -> key:value pairs
      • Relational vs nonrelational DB

      Query

      Queries are of type document
      E.g. {name: 'bob'} queries documents with name = 'bob'
      • Empty query (document) {}: gets all if querying multiple docs / get the 1st one if querying one

      Projection

      Select what’s returned by each query
      E.g. db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0, "instock.qty": 0 } )
      • Include item, status
      • Exclude _id, instock.qty (from embedded doc)

      Query Selectors

      Comparison
      Description
      Matches values that are equal to a specified value.
      Matches values that are greater than a specified value.
      Matches values that are greater than or equal to a specified value.
      Matches any of the values specified in an array.
      Matches values that are less than a specified value.
      Matches values that are less than or equal to a specified value.
      Matches all values that are not equal to a specified value.
      Matches none of the values specified in an array.
      Logical
      Description
      Joins query clauses with a logical AND returns all documents that match the conditions of both clauses.
      Inverts the effect of a query expression and returns documents that do not match the query expression.
      Joins query clauses with a logical NOR returns all documents that fail to match both clauses.
      Joins query clauses with a logical OR returns all documents that match the conditions of either clause.
      Element
      Description
      Matches documents that have the specified field.
      Selects documents if a field is of the specified type.
      Evaluation
      Description
      Allows use of aggregation expressions within the query language.
      Validate documents against the given JSON Schema.
      Performs a modulo operation on the value of a field and selects documents with a specified result.
      Selects documents where values match a specified regular expression.
      Performs text search.
      Matches documents that satisfy a JavaScript expression.
      Array
      Description
      Matches arrays that contain all elements specified in the query.
      Selects documents if element in the array field matches all the specified $elemMatch conditions.
      Selects documents if the array field is a specified size.
      Projects the first element in an array that matches the query condition.
      Limits the number of elements projected from an array. Supports skip and limit slices.

      Other: Bitwise, Geospatial, $rand

      Shell Commands

      Basic Commands
      Description
      db
      Display current database
      show dbs
      List all databases
      use cat
      Switch to the cat database
      show collections
      List all collections in the current database
      db.<collection>.find()
      List all documents in <collection>
      Find all documents in <collection> with name = 'bob'
      Insert a new document <doc> into <collection>
      Insert multiple new documents into <collection>
      Update a single existing document in the collection.Use update operator expressions.
      Update multiple existing documents in the collection.
      Insert either a new document or update an existing document in the
      Delete a single document from the collection.
      Delete documents from the collection.
      Drops or removes completely the collection
      Returns total number of documents in the collection.
      Querying Commands
      Description
      Return results in the specified <order>.sort( { name: 1 } ) =>Ascending; -1 for descending
      Limit result to <n> rows.
      Skip <n> results.
      Returns total number of documents in the collection.
      Returns the total number of documents that match the query.
      Find and return a single document; null if not found.

      Mongoose

      Node module to use MongoDB in NodeJS applications
      Object-document mapper: Map MongoDB documents to JS objects

      Schema

      Rules / template for documents
      Specifies what key-value Paris are stored & constraints
      Field Constraints
      Description
      Type
      Boolean/String/Number/etc.
      max
      min
      required
      Returns error if this field is not present
      default
      true/false: default value

      Use

      const mongoose = require("mongoose"); const URLSlugs = require("mongoose-url-slugs"); mongoose.model("Pizza", Pizza); mongoose.model("Topping", Topping); mongoose.connect("mongodb://localhost/pizzadb");

      Query

      User.findOne({ username }, (err, user) => { if (!err && user) { console.log(user); } else { console.log("USER NOT FOUND"); } });
      • Model
      • Embedded docs
      • Connect
      • Find
      • Write

      Create Entry

      new User({ username, email, password }).save((err, user) => { if (err) { console.log("DOCUMENT SAVE ERROR"); } else { console.log("User saved successfully: ", user.username); } });

      DevOps

      Docker

      Misc

      • Node, NPM, Git
      • Export & import modules

      Excluded Topics

      • Scaffolding
      • Route objects
      • Passport