vapor-docs/build/2.0/node/getting-started/index.html

1878 lines
46 KiB
HTML

<!DOCTYPE html>
<html class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="shortcut icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.1.1">
<title>Getting Started - Vapor Docs</title>
<script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
<link rel="stylesheet" href="../../assets/stylesheets/application-e5b48ab351.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto Slab:300,400,400i,700|Source+Code+Pro">
<style>body,input{font-family:"Roboto Slab","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Source Code Pro","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="../../stylesheets/extra.css">
</head>
<body>
<svg class="md-svg">
<defs>
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
<header class="md-header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="../.." title="Vapor Docs" class="md-logo md-header-nav__button">
<img src="../../images/droplet-white.svg" width="24" height="24">
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<span class="md-flex__ellipsis md-header-nav__title">
<span class="md-header-nav__parent">
Node
</span>
Getting Started
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
<div class="md-search" data-md-component="search">
<div class="md-search__overlay"></div>
<div class="md-search__inner">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
<label class="md-icon md-search__icon" for="search"></label>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result"></div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://github.com/vapor/documentation" title="Go to repository" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="drawer">
<i class="md-logo md-nav__button">
<img src="../../images/droplet-white.svg">
</i>
Vapor Docs
</label>
<div class="md-nav__source">
<a href="https://github.com/vapor/documentation" title="Go to repository" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." title="Overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Getting started
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Getting started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../getting-started/install-on-macos/" title="Install: macOS" class="md-nav__link">
Install: macOS
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/install-on-ubuntu/" title="Install: Ubuntu" class="md-nav__link">
Install: Ubuntu
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/toolbox/" title="Toolbox" class="md-nav__link">
Toolbox
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/hello-world/" title="Hello, World" class="md-nav__link">
Hello, World
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/manual/" title="Manual" class="md-nav__link">
Manual
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/xcode/" title="Xcode" class="md-nav__link">
Xcode
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
<label class="md-nav__link" for="nav-3">
Vapor
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-3">
Vapor
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../vapor/folder-structure/" title="Folder Structure" class="md-nav__link">
Folder Structure
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/droplet/" title="Droplet" class="md-nav__link">
Droplet
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/views/" title="Views" class="md-nav__link">
Views
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/controllers/" title="Controllers" class="md-nav__link">
Controllers
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/hash/" title="Hash" class="md-nav__link">
Hash
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/log/" title="Log" class="md-nav__link">
Log
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/commands/" title="Commands" class="md-nav__link">
Commands
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
Configs
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-4">
Configs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../configs/config/" title="Config" class="md-nav__link">
Config
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
JSON
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-5">
JSON
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../json/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../json/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
<label class="md-nav__link" for="nav-6">
Routing
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-6">
Routing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../routing/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/parameters/" title="Parameters" class="md-nav__link">
Parameters
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/group/" title="Group" class="md-nav__link">
Group
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/collection/" title="Collection" class="md-nav__link">
Collection
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
<label class="md-nav__link" for="nav-7">
Fluent
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-7">
Fluent
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../fluent/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/model/" title="Model" class="md-nav__link">
Model
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/database/" title="Database" class="md-nav__link">
Database
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/query/" title="Query" class="md-nav__link">
Query
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/relations/" title="Relations" class="md-nav__link">
Relations
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
<label class="md-nav__link" for="nav-8">
Cache
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-8">
Cache
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cache/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../cache/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
<label class="md-nav__link" for="nav-9">
MySQL
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-9">
MySQL
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mysql/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../mysql/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../mysql/driver/" title="Driver" class="md-nav__link">
Driver
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
<label class="md-nav__link" for="nav-10">
Redis
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-10">
Redis
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../redis/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../redis/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
<label class="md-nav__link" for="nav-11">
Auth
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-11">
Auth
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/helper/" title="Helper" class="md-nav__link">
Helper
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/password/" title="Password" class="md-nav__link">
Password
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/persist/" title="Persist" class="md-nav__link">
Persist
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
<label class="md-nav__link" for="nav-12">
Sessions
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-12">
Sessions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../sessions/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../sessions/sessions/" title="Sessions" class="md-nav__link">
Sessions
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-13" type="checkbox" id="nav-13">
<label class="md-nav__link" for="nav-13">
HTTP
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-13">
HTTP
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../http/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../http/request/" title="Request" class="md-nav__link">
Request
</a>
</li>
<li class="md-nav__item">
<a href="../../http/response/" title="Response" class="md-nav__link">
Response
</a>
</li>
<li class="md-nav__item">
<a href="../../http/middleware/" title="Middleware" class="md-nav__link">
Middleware
</a>
</li>
<li class="md-nav__item">
<a href="../../http/body/" title="Body" class="md-nav__link">
Body
</a>
</li>
<li class="md-nav__item">
<a href="../../http/response-representable/" title="ResponseRepresentable" class="md-nav__link">
ResponseRepresentable
</a>
</li>
<li class="md-nav__item">
<a href="../../http/responder/" title="Responder" class="md-nav__link">
Responder
</a>
</li>
<li class="md-nav__item">
<a href="../../http/client/" title="Client" class="md-nav__link">
Client
</a>
</li>
<li class="md-nav__item">
<a href="../../http/server/" title="Server" class="md-nav__link">
Server
</a>
</li>
<li class="md-nav__item">
<a href="../../http/cors/" title="CORS" class="md-nav__link">
CORS
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-14" type="checkbox" id="nav-14">
<label class="md-nav__link" for="nav-14">
Leaf
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-14">
Leaf
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../leaf/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../leaf/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../leaf/leaf/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-15" type="checkbox" id="nav-15">
<label class="md-nav__link" for="nav-15">
Validation
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-15">
Validation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../validation/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../validation/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-16" type="checkbox" id="nav-16" checked>
<label class="md-nav__link" for="nav-16">
Node
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-16">
Node
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
<label class="md-nav__link md-nav__link--active" for="toc">
Getting Started
</label>
<a href="./" title="Getting Started" class="md-nav__link md-nav__link--active">
Getting Started
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#why-do-we-have-node" title="Why do we have Node?" class="md-nav__link">
Why do we have Node?
</a>
</li>
<li class="md-nav__item">
<a href="#what-is-node" title="What is Node?" class="md-nav__link">
What is Node?
</a>
</li>
<li class="md-nav__item">
<a href="#how-do-i-use-it" title="How do I use it?" class="md-nav__link">
How do I use it?
</a>
</li>
<li class="md-nav__item">
<a href="#nodeinitializable" title="NodeInitializable" class="md-nav__link">
NodeInitializable
</a>
</li>
<li class="md-nav__item">
<a href="#noderepresentable" title="NodeRepresentable" class="md-nav__link">
NodeRepresentable
</a>
</li>
<li class="md-nav__item">
<a href="#context" title="Context" class="md-nav__link">
Context
</a>
</li>
<li class="md-nav__item">
<a href="#nodeconvertible" title="NodeConvertible" class="md-nav__link">
NodeConvertible
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-17" type="checkbox" id="nav-17">
<label class="md-nav__link" for="nav-17">
Core
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-17">
Core
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../core/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-18" type="checkbox" id="nav-18">
<label class="md-nav__link" for="nav-18">
Bits
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-18">
Bits
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../bits/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../bits/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-19" type="checkbox" id="nav-19">
<label class="md-nav__link" for="nav-19">
Debugging
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-19">
Debugging
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../debugging/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../debugging/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-20" type="checkbox" id="nav-20">
<label class="md-nav__link" for="nav-20">
Deploy
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-20">
Deploy
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../deploy/nginx/" title="Nginx" class="md-nav__link">
Nginx
</a>
</li>
<li class="md-nav__item">
<a href="../../deploy/supervisor/" title="Supervisor" class="md-nav__link">
Supervisor
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-21" type="checkbox" id="nav-21">
<label class="md-nav__link" for="nav-21">
Version (2.0)
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-21">
Version (2.0)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../version/1_5/" title="1.5" class="md-nav__link">
1.5
</a>
</li>
<li class="md-nav__item">
<a href="../../version/2_0/" title="2.0" class="md-nav__link">
2.0
</a>
</li>
<li class="md-nav__item">
<a href="../../version/support/" title="Support" class="md-nav__link">
Support
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#why-do-we-have-node" title="Why do we have Node?" class="md-nav__link">
Why do we have Node?
</a>
</li>
<li class="md-nav__item">
<a href="#what-is-node" title="What is Node?" class="md-nav__link">
What is Node?
</a>
</li>
<li class="md-nav__item">
<a href="#how-do-i-use-it" title="How do I use it?" class="md-nav__link">
How do I use it?
</a>
</li>
<li class="md-nav__item">
<a href="#nodeinitializable" title="NodeInitializable" class="md-nav__link">
NodeInitializable
</a>
</li>
<li class="md-nav__item">
<a href="#noderepresentable" title="NodeRepresentable" class="md-nav__link">
NodeRepresentable
</a>
</li>
<li class="md-nav__item">
<a href="#context" title="Context" class="md-nav__link">
Context
</a>
</li>
<li class="md-nav__item">
<a href="#nodeconvertible" title="NodeConvertible" class="md-nav__link">
NodeConvertible
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/vapor/documentation/edit/master/2.0/docs/node/getting-started.md" title="Edit this page" class="md-icon md-content__edit">edit</a>
<h1 id="getting-started">Getting Started<a class="headerlink" href="#getting-started" title="Permanent link">&para;</a></h1>
<h2 id="why-do-we-have-node">Why do we have Node?<a class="headerlink" href="#why-do-we-have-node" title="Permanent link">&para;</a></h2>
<p>The web is very stringy, Swift is very type-safe, this is a major problem when doing web development in Swift. Node is our attempt at providing a solution to this problem.</p>
<h2 id="what-is-node">What is Node?<a class="headerlink" href="#what-is-node" title="Permanent link">&para;</a></h2>
<p>Node is a data abstraction with an emphasis on being an intermediary between distinct types. For example, json from a client might use node to convert between the JSON and itself.</p>
<h2 id="how-do-i-use-it">How do I use it?<a class="headerlink" href="#how-do-i-use-it" title="Permanent link">&para;</a></h2>
<p>Node can be a little different to work with at first if you're familiar with less type-safe languages, let's look at a couple of examples and how we might start using Node in our projects. Most often, we'll be working with Node conversions.</p>
<h2 id="nodeinitializable">NodeInitializable<a class="headerlink" href="#nodeinitializable" title="Permanent link">&para;</a></h2>
<p>NodeInitializable can be read and understood as <code>An object that can be initialized with a Node</code>. Let's look at a simple implementation.</p>
<div class="codehilite"><pre><span></span><span class="kd">struct</span> <span class="nc">Person</span><span class="p">:</span> <span class="n">NodeInitializable</span> <span class="p">{</span>
<span class="kd">let</span> <span class="nv">name</span><span class="p">:</span> <span class="nb">String</span>
<span class="kd">let</span> <span class="nv">age</span><span class="p">:</span> <span class="nb">Int</span>
<span class="kd">init</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">Node</span><span class="p">)</span> <span class="kr">throws</span> <span class="p">{</span>
<span class="n">name</span> <span class="p">=</span> <span class="k">try</span> <span class="n">node</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s">&quot;name&quot;</span><span class="p">)</span>
<span class="n">age</span> <span class="p">=</span> <span class="k">try</span> <span class="n">node</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Now that we have this, we can easily convert abstract data to a Person. Here's how that might look:</p>
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">person</span> <span class="p">=</span> <span class="k">try</span> <span class="n">Person</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">json</span><span class="p">)</span>
</pre></div>
<blockquote>
<p>Note: There are some more advanced functionality options for JSON and database Row types in particular, we'll cover that later.</p>
</blockquote>
<p>By conforming our <code>Person</code> object to <code>NodeInitializable</code>, we can also use more advanced cases such as arrays:</p>
<div class="codehilite"><pre><span></span>let people = try [Person](node: jsonArray)
</pre></div>
<h2 id="noderepresentable">NodeRepresentable<a class="headerlink" href="#noderepresentable" title="Permanent link">&para;</a></h2>
<p>NodeRepresentable can be read and understood as <code>An object that can be represented as a Node</code>. Let's take a look at a simple implementation. We'll stick with the <code>Person</code> example above</p>
<div class="codehilite"><pre><span></span><span class="kd">extension</span> <span class="nc">Person</span><span class="p">:</span> <span class="n">NodeRepresentable</span> <span class="p">{</span>
<span class="kd">func</span> <span class="nf">makeNode</span><span class="p">(</span><span class="k">in</span> <span class="n">context</span><span class="p">:</span> <span class="n">Context</span><span class="p">)</span> <span class="kr">throws</span> <span class="p">-&gt;</span> <span class="n">Node</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">try</span> <span class="n">node</span><span class="p">.</span><span class="kr">set</span><span class="p">(</span><span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">try</span> <span class="n">node</span><span class="p">.</span><span class="kr">set</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">,</span> <span class="n">age</span><span class="p">)</span>
<span class="k">return</span> <span class="n">node</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Now that we've done this, we can easily convert our <code>person</code> or a collection of <code>Person</code> objects into a <code>Node</code>.</p>
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">node</span> <span class="p">=</span> <span class="k">try</span> <span class="n">person</span><span class="p">.</span><span class="n">makeNode</span><span class="p">(</span><span class="k">in</span><span class="p">:</span> <span class="kc">nil</span><span class="p">)</span>
</pre></div>
<p>And also for collections, like arrays</p>
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">node</span> <span class="p">=</span> <span class="k">try</span> <span class="p">[</span><span class="n">kim</span><span class="p">,</span> <span class="n">joe</span><span class="p">,</span> <span class="n">jan</span><span class="p">].</span><span class="n">makeNode</span><span class="p">(</span><span class="k">in</span><span class="p">:</span> <span class="kc">nil</span><span class="p">)</span>
</pre></div>
<h2 id="context">Context<a class="headerlink" href="#context" title="Permanent link">&para;</a></h2>
<p>Up to this point, we've seen <code>Context</code> a lot, but what's it for. When we're serializing or mapping an object, we might have a lot of different situations we're mapping differently for. Maybe one is for the database, one is for the view, one is for JSON, etc.</p>
<p>If you're using Vapor, we provide a lot of contexts and more native integration options, but here's how one might define their own.</p>
<div class="codehilite"><pre><span></span><span class="kd">import</span> <span class="nc">Node</span>
<span class="kr">final</span> <span class="kd">class</span> <span class="nc">MyContext</span><span class="p">:</span> <span class="n">Context</span> <span class="p">{</span>
<span class="p">}</span>
<span class="kd">let</span> <span class="nv">myContext</span> <span class="p">=</span> <span class="n">MyContext</span><span class="p">()</span>
<span class="kd">extension</span> <span class="nc">Context</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nv">isMyContext</span><span class="p">:</span> <span class="nb">Bool</span> <span class="p">{</span>
<span class="k">return</span> <span class="kc">self</span> <span class="k">is</span> <span class="n">MyContext</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Now inside our object, we could add special behavior.</p>
<div class="codehilite"><pre><span></span><span class="kd">extension</span> <span class="nc">Person</span><span class="p">:</span> <span class="n">NodeRepresentable</span> <span class="p">{</span>
<span class="kd">func</span> <span class="nf">makeNode</span><span class="p">(</span><span class="k">in</span> <span class="n">context</span><span class="p">:</span> <span class="n">Context</span><span class="p">)</span> <span class="kr">throws</span> <span class="p">-&gt;</span> <span class="n">Node</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">try</span> <span class="n">node</span><span class="p">.</span><span class="kr">set</span><span class="p">(</span><span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">try</span> <span class="n">node</span><span class="p">.</span><span class="kr">set</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">,</span> <span class="n">age</span><span class="p">)</span>
<span class="k">if</span> <span class="n">context</span><span class="p">.</span><span class="n">isMyContext</span> <span class="p">{</span>
<span class="k">try</span> <span class="n">node</span><span class="p">.</span><span class="kr">set</span><span class="p">(</span><span class="s">&quot;special-attribute&quot;</span><span class="p">,</span> <span class="n">special</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">node</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>We might call it like this:</p>
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">specialNode</span> <span class="p">=</span> <span class="n">person</span><span class="p">.</span><span class="n">makeNode</span><span class="p">(</span><span class="k">in</span><span class="p">:</span> <span class="n">myContext</span><span class="p">)</span>
</pre></div>
<p>This is a common usage, but can be adapted for any scenario where we require special metadata to help us properly serialize or map our object.</p>
<h2 id="nodeconvertible"><code>NodeConvertible</code><a class="headerlink" href="#nodeconvertible" title="Permanent link">&para;</a></h2>
<p>NodeConvertible is simply the combination of Representable and Initializable. These objects can be converted easily to and from node. Taking our Person object from earlier, we should be able to do this:</p>
<div class="codehilite"><pre><span></span><span class="c1">// ..</span>
<span class="kd">let</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">person</span><span class="p">.</span><span class="n">makeNode</span><span class="p">(</span><span class="k">in</span><span class="p">:</span> <span class="n">myContext</span><span class="p">)</span>
<span class="kd">let</span> <span class="nv">back</span> <span class="p">=</span> <span class="k">try</span> <span class="n">Person</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span>
<span class="bp">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">\(</span><span class="n">person</span><span class="si">)</span><span class="s"> went to node and back to </span><span class="si">\(</span><span class="n">back</span><span class="si">)</span><span class="s">&quot;</span><span class="p">)</span>
</pre></div>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../package/" title="Package" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Package
</span>
</div>
</a>
<a href="../../core/package/" title="Package" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Package
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2017 Qutheory, LLC
</div>
powered by
<a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
and
<a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
Material for MkDocs</a>
</div>
<div class="md-footer-social">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<a href="https://twitter.com/@codevapor" class="md-footer-social__link fa fa-twitter"></a>
<a href="http://vapor.team/" class="md-footer-social__link fa fa-slack"></a>
</div>
</div>
</div>
</footer>
</div>
<script src="../../assets/javascripts/application-f6cd941c96.js"></script>
<script>app.initialize({url:{base:"../.."}})</script>
<script>!function(e,t,n,a,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(n),i=t.getElementsByTagName(n)[0],c.async=1,c.src=a,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-76177358-4","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})}),document.forms.search.query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
</body>
</html>