<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: warenix</title>
    <description>The latest articles on Forem by warenix (@warenix).</description>
    <link>https://forem.com/warenix</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F120266%2Fea06932b-c64b-4efe-abc6-f26151912422.jpeg</url>
      <title>Forem: warenix</title>
      <link>https://forem.com/warenix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/warenix"/>
    <language>en</language>
    <item>
      <title>How to Deploy Express on Now.sh</title>
      <dc:creator>warenix</dc:creator>
      <pubDate>Fri, 07 Dec 2018 04:30:47 +0000</pubDate>
      <link>https://forem.com/warenix/how-to-deploy-express-on-nowsh-414i</link>
      <guid>https://forem.com/warenix/how-to-deploy-express-on-nowsh-414i</guid>
      <description>&lt;h1&gt;
  
  
  How to Deploy Express on Now.sh
&lt;/h1&gt;

&lt;p&gt;In this post I'm going to share how to setup express API endpoints to run on version 2 of &lt;a href="https://zeit.co/docs/v2/getting-started/introduction-to-now"&gt;Now.sh&lt;/a&gt;. You will get a free https endpoints and run in serverless! Isn't it cool?&lt;/p&gt;

&lt;p&gt;You can find full source code at &lt;a href="https://github.com/warenix/express-now"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Now CLI (12.1.9)&lt;/li&gt;
&lt;li&gt;  Node (v10.10.0)&lt;/li&gt;
&lt;li&gt;  express (4.16.4)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Add Endpoints to express
&lt;/h2&gt;

&lt;p&gt;For simplicity we are going to have 2 endpoints to show how to handle &lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;POST&lt;/code&gt; requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  /get - GET
&lt;/h2&gt;

&lt;p&gt;This returns &lt;code&gt;VERSION&lt;/code&gt; in json output.&lt;/p&gt;

&lt;p&gt;Edit &lt;code&gt;index.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/get&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VERSION&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  /post - POST
&lt;/h2&gt;

&lt;p&gt;Echo back JSON content being posted.&lt;/p&gt;

&lt;p&gt;Edit &lt;code&gt;index.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Storing Secret as Environment Variable
&lt;/h2&gt;

&lt;p&gt;You may have noticed in the '/get' endpoint we used &lt;code&gt;process.env.VERSION&lt;/code&gt;. This is a common practice not to hardcode secrets in code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set Environment Variables
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Deploy to &lt;code&gt;now.sh&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setup Build for &lt;code&gt;now&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;We need to setup &lt;code&gt;build&lt;/code&gt; to use &lt;code&gt;@now/node-server&lt;/code&gt;. (Using &lt;code&gt;@now/node&lt;/code&gt; just won't work). Modify &lt;code&gt;now.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"builds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@now/node-server"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Read more at &lt;a href="https://zeit.co/docs/v2/deployments/official-builders/node-js-server-now-node-server/"&gt;doc&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set Environment Variable as Secret in &lt;code&gt;now.sh&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;now-linux secret add VERSION &lt;span class="nv"&gt;$VERSION&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Read more at &lt;a href="https://zeit.co/docs/v2/deployments/environment-variables-and-secrets/"&gt;doc&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Allow CORS
&lt;/h3&gt;

&lt;p&gt;Here we need to add custom response headers. Modify &lt;code&gt;now.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"routes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Access-Control-Allow-Origin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Access-Control-Allow-Methods"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET, POST, PUT, DELETE, OPTIONS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Access-Control-Allow-Headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X-Requested-With, Content-Type, Accept"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/index.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Read more at &lt;a href="https://zeit.co/docs/v2/deployments/configuration/#routes"&gt;doc&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Push to &lt;code&gt;now.sh&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;now-linux
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sample output&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ now-linux
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; UPDATE AVAILABLE The latest version of Now CLI is 12.1.9
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Read more about how to update here: https://zeit.co/update-cli
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Changelog: https://github.com/zeit/now-cli/releases/tag/12.1.9
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Deploying ~/code/repo/github/express-now under XXXXXXX
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Synced 2 files &lt;span class="o"&gt;(&lt;/span&gt;929B&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;1s]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; https://express-now-3b57ke4d4.now.sh &lt;span class="o"&gt;[&lt;/span&gt;v2] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;clipboard] &lt;span class="o"&gt;[&lt;/span&gt;1s]
┌ index.js        Ready               &lt;span class="o"&gt;[&lt;/span&gt;17s]
└── λ index.js &lt;span class="o"&gt;(&lt;/span&gt;284.31KB&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;sfo1]
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Success! Deployment ready &lt;span class="o"&gt;[&lt;/span&gt;19s]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Tests
&lt;/h2&gt;

&lt;p&gt;Spin up a localhost server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Test &lt;code&gt;/get&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In terminal,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3000/get
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"version"&lt;/span&gt;:&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Test &lt;code&gt;/post&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In terminal,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"message":"hello"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://localhost:3000/post
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;:&lt;span class="s2"&gt;"hello"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Note: You can replace &lt;code&gt;localhost&lt;/code&gt; with the now.sh instance url.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotcha
&lt;/h2&gt;

&lt;p&gt;Perhaps due to the nature of serverless sometime the endpoint returns &lt;code&gt;502&lt;/code&gt; error. To tackle that please add retry mechanism to your service callers.&lt;/p&gt;

</description>
      <category>node</category>
      <category>serverless</category>
      <category>nowsh</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
