<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Express | Xuanhao</title><link>https://www.xh-zhang.com/tags/express/</link><atom:link href="https://www.xh-zhang.com/tags/express/index.xml" rel="self" type="application/rss+xml"/><description>Express</description><generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>en-us</language><lastBuildDate>Wed, 02 Oct 2019 16:32:52 -0400</lastBuildDate><image><url>https://www.xh-zhang.com/img/icon-192.png</url><title>Express</title><link>https://www.xh-zhang.com/tags/express/</link></image><item><title>YelpBBQ</title><link>https://www.xh-zhang.com/project/yelpbbq/</link><pubDate>Wed, 02 Oct 2019 16:32:52 -0400</pubDate><guid>https://www.xh-zhang.com/project/yelpbbq/</guid><description>
&lt;h1 id=&#34;yelpbbq&#34;&gt;YelpBBQ&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;A RESTful Node.js web application project that allows users to share their BBQ experience by uploading photos and comments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;live-demo&#34;&gt;Live Demo&lt;/h2&gt;
&lt;p&gt;To see the app in action, go to &lt;a href=&#34;https://calm-depths-02705.herokuapp.com/&#34; target=&#34;_blank&#34;&gt;https://calm-depths-02705.herokuapp.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Username: guest
Password: guest&lt;/p&gt;
&lt;h2 id=&#34;features&#34;&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Authentication:
&lt;ul&gt;
&lt;li&gt;User login with username and password&lt;/li&gt;
&lt;li&gt;Admin sign-up with admin code&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Authorization:
&lt;ul&gt;
&lt;li&gt;One cannot manage posts and view user profile without being authenticated&lt;/li&gt;
&lt;li&gt;One cannot edit or delete posts and comments created by other users&lt;/li&gt;
&lt;li&gt;Admin can manage all posts and comments&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Manage campground posts with basic functionalities:
&lt;ul&gt;
&lt;li&gt;Create, edit and delete posts and comments&lt;/li&gt;
&lt;li&gt;Upload campground photos&lt;/li&gt;
&lt;li&gt;Display campground location on Google Maps&lt;/li&gt;
&lt;li&gt;Search existing campgrounds&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Manage user account with basic functionalities:
Password reset via email confirmation~~ (disabled)
&lt;ul&gt;
&lt;li&gt;Profile page setup with sign-up&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Flash messages responding to users&amp;rsquo; interaction with the app&lt;/li&gt;
&lt;li&gt;Responsive web design&lt;/li&gt;
&lt;li&gt;&lt;h3 id=&#34;custom-enhancements&#34;&gt;Custom Enhancements&lt;/h3&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update campground photos when editing campgrounds&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update personal information on profile page&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve image load time on the landing page using Cloudinary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Helmet to strengthen security&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;front-end&#34;&gt;Front-end&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;ejs&lt;/a&gt;(&lt;a href=&#34;http://ejs.co/&#34; target=&#34;_blank&#34;&gt;http://ejs.co/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;Google Maps APIs&lt;/a&gt;(&lt;a href=&#34;https://developers.google.com/maps/&#34; target=&#34;_blank&#34;&gt;https://developers.google.com/maps/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;Bootstrap&lt;/a&gt;(&lt;a href=&#34;https://getbootstrap.com/docs/3.3/&#34; target=&#34;_blank&#34;&gt;https://getbootstrap.com/docs/3.3/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;back-end&#34;&gt;Back-end&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;express&lt;/a&gt;(&lt;a href=&#34;https://expressjs.com/&#34; target=&#34;_blank&#34;&gt;https://expressjs.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;mongoDB&lt;/a&gt;(&lt;a href=&#34;https://www.mongodb.com/&#34; target=&#34;_blank&#34;&gt;https://www.mongodb.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;mongoose&lt;/a&gt;(&lt;a href=&#34;http://mongoosejs.com/&#34; target=&#34;_blank&#34;&gt;http://mongoosejs.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;async&lt;/a&gt;(&lt;a href=&#34;http://caolan.github.io/async/&#34; target=&#34;_blank&#34;&gt;http://caolan.github.io/async/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;crypto&lt;/a&gt;(&lt;a href=&#34;https://nodejs.org/api/crypto.html#crypto_crypto&#34; target=&#34;_blank&#34;&gt;https://nodejs.org/api/crypto.html#crypto_crypto&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;helmet&lt;/a&gt;(&lt;a href=&#34;https://helmetjs.github.io/&#34; target=&#34;_blank&#34;&gt;https://helmetjs.github.io/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;passport&lt;/a&gt;(&lt;a href=&#34;http://www.passportjs.org/&#34; target=&#34;_blank&#34;&gt;http://www.passportjs.org/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;passport-local&lt;/a&gt;(&lt;a href=&#34;https://github.com/jaredhanson/passport-local#passport-local&#34; target=&#34;_blank&#34;&gt;https://github.com/jaredhanson/passport-local#passport-local&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;express-session&lt;/a&gt;(&lt;a href=&#34;https://github.com/expressjs/session#express-session&#34; target=&#34;_blank&#34;&gt;https://github.com/expressjs/session#express-session&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;method-override&lt;/a&gt;(&lt;a href=&#34;https://github.com/expressjs/method-override#method-override&#34; target=&#34;_blank&#34;&gt;https://github.com/expressjs/method-override#method-override&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;nodemailer&lt;/a&gt;(&lt;a href=&#34;https://nodemailer.com/about/&#34; target=&#34;_blank&#34;&gt;https://nodemailer.com/about/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;moment&lt;/a&gt;(&lt;a href=&#34;https://momentjs.com/&#34; target=&#34;_blank&#34;&gt;https://momentjs.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;cloudinary&lt;/a&gt;(&lt;a href=&#34;https://cloudinary.com/&#34; target=&#34;_blank&#34;&gt;https://cloudinary.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;geocoder&lt;/a&gt;(&lt;a href=&#34;https://github.com/wyattdanger/geocoder#geocoder&#34; target=&#34;_blank&#34;&gt;https://github.com/wyattdanger/geocoder#geocoder&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;connect-flash&lt;/a&gt;(&lt;a href=&#34;https://github.com/jaredhanson/connect-flash#connect-flash&#34; target=&#34;_blank&#34;&gt;https://github.com/jaredhanson/connect-flash#connect-flash&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;platforms&#34;&gt;Platforms&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;Cloudinary&lt;/a&gt;(&lt;a href=&#34;https://cloudinary.com/&#34; target=&#34;_blank&#34;&gt;https://cloudinary.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;Heroku&lt;/a&gt;(&lt;a href=&#34;https://www.heroku.com/&#34; target=&#34;_blank&#34;&gt;https://www.heroku.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;Cloud9&lt;/a&gt;(&lt;a href=&#34;https://aws.amazon.com/cloud9/?origin=c9io&#34; target=&#34;_blank&#34;&gt;https://aws.amazon.com/cloud9/?origin=c9io&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;what-next&#34;&gt;What Next&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Immigrate to AWS and DynamoDB&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>