From c1df0d3d03e052f5354ba2b7969a48362f402eae Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Sat, 16 Mar 2019 20:16:41 +0100 Subject: [PATCH] fix: add author size limitation (#154) Just for skipping false-hood values .cc @wooorm --- package.json | 2 +- packages/metascraper-helpers/index.js | 8 +- packages/metascraper-helpers/package.json | 6 +- .../metascraper-media-provider/package.json | 2 +- .../src/get-media/twitter-info.js | 4 +- .../metascraper-media-provider/test/index.js | 2 +- packages/metascraper-youtube/package.json | 4 +- .../__snapshots__/index.js.snap-shot | 26 +- packages/metascraper/package.json | 4 +- .../test/integration/et-tech/input.html | 597 ------------ .../{et-tech => learnnode}/index.js | 5 +- .../test/integration/learnnode/input.html | 895 ++++++++++++++++++ 12 files changed, 928 insertions(+), 627 deletions(-) delete mode 100644 packages/metascraper/test/integration/et-tech/input.html rename packages/metascraper/test/integration/{et-tech => learnnode}/index.js (82%) create mode 100644 packages/metascraper/test/integration/learnnode/input.html diff --git a/package.json b/package.json index f4c3edef1..a34ed9e37 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "clean": "rm -rf node_modules && cd packages && eachdir rm -rf node_modules", "dev": "concurrently \"gulp\" \"npm run server:dev\"", "lint": "standard-markdown README.md && standard", - "postinstall": "lerna bootstrap && lerna link --force-local", + "postinstall": "lerna bootstrap --no-ci && lerna link --force-local", "prerelease": "npm run update:check", "pretest": "npm run lint", "preversion": "lerna exec npx finepack && git-authors-cli && finepack", diff --git a/packages/metascraper-helpers/index.js b/packages/metascraper-helpers/index.js index e183d12a1..5f34af81e 100644 --- a/packages/metascraper-helpers/index.js +++ b/packages/metascraper-helpers/index.js @@ -10,7 +10,9 @@ const { flow, chain, isEmpty, - eq + eq, + lte, + size } = require('lodash') const langs = require('iso-639-3').map(({ iso6391 }) => iso6391) @@ -61,6 +63,8 @@ const REGEX_LOCATION = /^[A-Z\s]+\s+[-—–]\s+/ const TRUNCATE_MAX_LENGTH = 300 +const AUTHOR_MAX_LENGTH = 128 + const removeLocation = value => replace(value, REGEX_LOCATION, '') const isUrl = (url, { relative = false } = {}) => @@ -102,7 +106,7 @@ const $filter = ($, domNodes, fn = defaultFn) => { } const isAuthor = (str, opts = { relative: false }) => - isString(str) && !isUrl(str, opts) + !isUrl(str, opts) && isString(str) && lte(size(str), AUTHOR_MAX_LENGTH) const getAuthor = (str, opts = { removeBy: true }) => titleize(str, opts) diff --git a/packages/metascraper-helpers/package.json b/packages/metascraper-helpers/package.json index c3e1854e1..6ae7e2861 100644 --- a/packages/metascraper-helpers/package.json +++ b/packages/metascraper-helpers/package.json @@ -17,7 +17,7 @@ ], "dependencies": { "audio-extensions": "0.0.0", - "chrono-node": "~1.3.5", + "chrono-node": "~1.3.11", "condense-whitespace": "~1.0.0", "file-extension": "~4.0.5", "image-extensions": "~1.1.0", @@ -26,8 +26,8 @@ "iso-639-3": "~1.1.0", "isostring": "0.0.1", "lodash": "~4.17.11", - "mime-types": "~2.1.21", - "normalize-url": "~4.1.0", + "mime-types": "~2.1.22", + "normalize-url": "~4.2.0", "smartquotes": "~2.3.1", "title": "~3.4.1", "truncate": "~2.0.1", diff --git a/packages/metascraper-media-provider/package.json b/packages/metascraper-media-provider/package.json index b7eaf35c7..8a9936537 100644 --- a/packages/metascraper-media-provider/package.json +++ b/packages/metascraper-media-provider/package.json @@ -18,7 +18,7 @@ ], "dependencies": { "@metascraper/helpers": "^4.10.1", - "@microlink/youtube-dl": "~1.13.0", + "@microlink/youtube-dl": "~1.13.1", "got": "~9.6.0", "lodash": "~4.17.11", "memoize-one": "~5.0.0", diff --git a/packages/metascraper-media-provider/src/get-media/twitter-info.js b/packages/metascraper-media-provider/src/get-media/twitter-info.js index f327ac78d..9855addd2 100644 --- a/packages/metascraper-media-provider/src/get-media/twitter-info.js +++ b/packages/metascraper-media-provider/src/get-media/twitter-info.js @@ -28,7 +28,7 @@ const API_GUEST_ACTIVATE_EXPIRE = 10 * 60 * 1000 // 10 min const { PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS } = process.env -let agent = PROXY_HOST +const agent = PROXY_HOST ? tunnel.httpsOverHttp({ proxy: { host: PROXY_HOST, @@ -43,7 +43,7 @@ const getGuestToken = async (url = '', opts = {}) => { const { body } = await got.post( 'https://api.twitter.com/1.1/guest/activate.json', { - headers: { Authorization: TWITTER_BEARER_TOKEN, Referer: url }, + headers: { Authorization: TWITTER_BEARER_TOKEN }, json: true, retry: 0, agent, diff --git a/packages/metascraper-media-provider/test/index.js b/packages/metascraper-media-provider/test/index.js index bbf53169e..4f0caa982 100644 --- a/packages/metascraper-media-provider/test/index.js +++ b/packages/metascraper-media-provider/test/index.js @@ -84,7 +84,7 @@ describe('metascraper-media-provider', () => { ;[ 'https://twitter.com/verge/status/957383241714970624', 'https://twitter.com/telediario_tve/status/1036860275859775488', - 'https://twitter.com/Mei_Gui8/status/1037374230785142785' + 'https://twitter.com/futurism/status/882987478541533189' ].forEach(url => { it(url, async () => { const metadata = await metascraper({ url }) diff --git a/packages/metascraper-youtube/package.json b/packages/metascraper-youtube/package.json index e434aa4fc..adf18d411 100644 --- a/packages/metascraper-youtube/package.json +++ b/packages/metascraper-youtube/package.json @@ -18,9 +18,9 @@ ], "dependencies": { "@metascraper/helpers": "^4.10.1", - "get-video-id": "~3.1.0", + "get-video-id": "~3.1.1", "is-reachable": "~3.0.0", - "p-locate": "~3.0.0" + "p-locate": "~4.0.0" }, "devDependencies": { "mocha": "latest", diff --git a/packages/metascraper/__snapshots__/index.js.snap-shot b/packages/metascraper/__snapshots__/index.js.snap-shot index 3555ed7ce..38edc0e05 100644 --- a/packages/metascraper/__snapshots__/index.js.snap-shot +++ b/packages/metascraper/__snapshots__/index.js.snap-shot @@ -206,19 +206,6 @@ exports['entrepreneur 1'] = { "url": "https://www.entrepreneur.com/article/275188" } -exports['et-tech 1'] = { - "author": "TV Mahalingam", - "date": "2016-05-25T00:00:00.000Z", - "description": "Dell speaks about the complexities of engineering the biggest acquisition in tech history, Dell’s future bets and why he continues to remain bullish..", - "image": "http://economictimes.indiatimes.com/photo/michael-dell-on-complexities-involved-in-pulling-off-the-biggest-tech-acquisition-dell-s-future-bets-more/52424992.cms", - "video": null, - "lang": null, - "logo": "http://b2bstatic.iimg.in/Themes/Release/images/responsive/tech-logo-square.jpg", - "publisher": "ETtech.com", - "title": "Michael Dell on complexities involved in pulling off the biggest tech acquisition, Dell’s future bets & more | ETtech", - "url": "http://tech.economictimes.indiatimes.com/news/corporate/michael-dell-biggest-tech-acquisition-future-bets/52424992" -} - exports['eweek 1'] = { "author": "Darryl K. Taft", "date": "2019-01-09T09:01:37.000Z", @@ -994,3 +981,16 @@ exports['engadget 1'] = { "url": "https://www.engadget.com/2019/01/07/all-github-users-keep-code-private/" } +exports['learnnode 1'] = { + "author": null, + "date": null, + "description": "A premium training course to learn to build apps with Node.js, Express, MongoDB, and friends.", + "image": "https://learnnode.com/images/NODE/poster.jpg", + "video": "https://player.vimeo.com/external/216213305.sd.mp4?s=815e208b400abe120e9b860dad68762bcf4b828a&profile_id=164", + "lang": null, + "logo": "https://learnnode.com/images/NODE/favicon.png", + "publisher": "Learn Node", + "title": "Learn Node", + "url": "https://learnnode.com" +} + diff --git a/packages/metascraper/package.json b/packages/metascraper/package.json index 431f3b372..3b4857390 100644 --- a/packages/metascraper/package.json +++ b/packages/metascraper/package.json @@ -55,8 +55,8 @@ "cheerio": "~1.0.0-rc.2", "cheerio-advanced-selectors": "~2.0.1", "lodash": "~4.17.11", - "p-reduce": "~1.0.0", - "whoops": "~4.0.1" + "p-reduce": "~2.0.0", + "whoops": "~4.0.2" }, "devDependencies": { "clear-module": "latest", diff --git a/packages/metascraper/test/integration/et-tech/input.html b/packages/metascraper/test/integration/et-tech/input.html deleted file mode 100644 index 54cc0ff29..000000000 --- a/packages/metascraper/test/integration/et-tech/input.html +++ /dev/null @@ -1,597 +0,0 @@ - - - - -michael dell biggest tech acquisition future bets | ETtech - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
- -
-

Michael Dell on complexities involved in pulling off the biggest tech acquisition, Dell's future bets & more

Dell speaks about the complexities of engineering the biggest acquisition in tech history, Dell’s future bets and why he continues to remain bullish about India
- - -
-
 
 
-
-
- - -
- -
For the man who is pulling off the largest technology merger in history, Michael Dell appears incredibly calm.

Even as tech pundits continue to debate about the merits of the $59 billion marriage between Dell and EMC, which is expected to consummated by October, Dell CEO Michael Dell flew down to Bangalore for a day long visit to review India operations - which is now 20 years old.

In an exclusive chat with ET's TV Mahalingam, Dell spoke about the complexities of engineering the biggest acquisition in tech history, Dell's future bets and why he continues to remain bullish about India. Excerpts:

Q. So, you are engineering the largest acquisition in tech history. Was it a tough decision to green flag?

A: There is a fair bit of history here. Dell and EMC had a partnership for almost a decade (Dell-EMC) and that became a $2 bn business. Then around the fall of 2014, I contacted Joe Tucci (EMC CEO) - we have had this discussion in earlier years if we should combine the two companies. I told him we should look at this again. We had extensive meetings, discussions, due diligence.

Over a year later, the transaction was announced. It was long process. If you look at what we are doing, these companies are highly complementary. You have to look at very positive customer reaction...one customer called it three easy pieces: Dell, EMC & VMware. Dell is the servers, EMC is the storage and VMware is the virtualisation (there's more to it than that).

Q. Dell and EMC are disparate entities. EMC is has a federation structure (with entities like VMware, EMC II, Virtustream, Pivotal) while Dell is a more linear company. How complex is it carry out an acquisition of these two disparate structures?

There aren't a lot of areas where you have overlap in the business. In the overall company, we will have the enterprise, data center business (Dell-EMC) - which brings together the EMC information infrastructure business and the Dell data center business - which is a world leading business.

And we have client business, which continues to be branded Dell. and the overall group of Dell EMC and Dell Client business, VMWare, Pivotal, Secureworks will be called Dell Technologies. How complicated is it? We asked ourselves 40 big questions - for instance, EMC has channel program, Dell has a channel program, what do you do - that we had to answer. We have answered 35 of those questions. We have a whole schedule for it.

Q. So, who is your new competition?

If you look at what we do now, we are competing with one part of HP or another part of some little company over here or another company over there. I think it is going to be very difficult to be a company in silos.

I think the game has changed. We won't define our success by looking at the competitors but at how satisfied are our customers, how engaged are our internal stakeholders and how good is our product pipeline.

Finally, we will look at our share in some of the markets we are in. some of the markets are growing. We want to grow faster than the market. Some of the markets are shrinking. We want to gain market share even if it is shrinking.

If you look at the PC market, it's changing...virtual PCs, physical PCs...we are in our 14th quarter in a row of of consecutive market share gain. While we gained in the biggest market in the world 2.5 points of share, HP lost -2.4 of share. We took share away from HP. In a market consolidation, you take market share away from the competition. We also have a better capital structure and we are private company. That allows us to think beyond the next 90 days...we can think about 3 years, 5 years, a lifetime.

Q. You have led Dell through several transformations from the PC era to going private. Whats next for Dell?

Our industry is change or die. The role of IT is fundamentally changing. For last several decades, it's been about taking existing businesses and making them more efficient with IT. Whats happening now is that IT is evolving so quickly that its enabling all kinds of new businesses and new business models.

This is where new companies like Tesla, Uber, Airbnb are jumping in. All this is making companies are jump up and embrace digital transformation. So, we have Ford Motors saying we can't make cars anymore, we are making computers with wheels. If you give the control of the car to Google or Apple, maybe you've just created your competitor.

How is Ford addressing this? By building it all on Pivotal Cloud Foundry. We are in the beginning of the digital transformation. We are changing our company (by doing the EMC acquisition) so that we can help our customers transform themselves.

Q. You've been a regular visitor to India now. What's your sense of the business environment here? Have things changed?

The mood is pretty positive...stable steady economic growth is encouraging. I think government initiatives have been well received. Relative to other economies in the world, India has a good feel to it.

Q. Dell completes 20 years in India this year. What are your expectations for India from here? What about the startups space - does that excite you?

The startup ecosystem in India continues to evolve very nicely. I see the steps that the government is taking to encourage that. Our own family foundation is making several PRI investments in companies that have a social mission. I think India has a very bright future. I have been very consistent in my bullishness of India for quite sometime and that's why we came here 20 years and that's why we continue to expand.

Q. With the Perot business being sold, you have pared back on the IT services business. What do you see as India's new role in the Dell world?

Our services business was about $9 billion in revenues. We are selling the former Perot business which is about $3 billion to our good friends NTT. We are keeping the $6 billion business and we are adding to it the EMC business (which is another $6 billion business), so the new services business is $12 billion. And as you know EMC has a big operation here in Bangalore as does VMware.

So, if you look at it from number of people we had this many people (points around his forehead), then with Perot's sale we went to this many (gestures around his shoulder) and now (with EMC) we have this many (points again towards his forehead). The number of people in India is more or less the same, just the mix has changed.

Q. Everybody is talking about American elections. Donald Trump. What's your take on this?

I really don't want to comment on that. But if you look at the American political system, you have the executive branch, the legislative branch and the judicial branch. People assume that the executive branch has more power than it actually has. Only the legislative branch can create the laws, the executive branch cannot create the laws.

So, if the executive branch tries to create a branch one side or the other..you go back to the founders of the nation, they set up a system that ensures that it doesn't happen. So, people assume that the executive branch has more power than what it actually has.
- -
-
 
 
-
-
- - -
-
- -
- - -

Sponsored Stories

      -
      -
      - - - - - - - -
      - ETtech - ETtech An initiative of The Economic Times - editor@ettech.com - Times Internet Limited (Times Center), FC - 6, Sector 16 A, Film City, Noida - 201301 Uttar Pradesh, India - ETtech.com Square Logo - -
      -
      -
      - -
      - - - - - - - - diff --git a/packages/metascraper/test/integration/et-tech/index.js b/packages/metascraper/test/integration/learnnode/index.js similarity index 82% rename from packages/metascraper/test/integration/et-tech/index.js rename to packages/metascraper/test/integration/learnnode/index.js index b8b5dc93d..8030abe4a 100644 --- a/packages/metascraper/test/integration/et-tech/index.js +++ b/packages/metascraper/test/integration/learnnode/index.js @@ -22,10 +22,9 @@ const metascraper = require('../../..')([ const readFile = promisify(fs.readFile) -const url = - 'http://tech.economictimes.indiatimes.com/news/corporate/michael-dell-biggest-tech-acquisition-future-bets/52424992' +const url = 'https://learnnode.com' -it('et-tech', async () => { +it('learnnode', async () => { const html = await readFile(resolve(__dirname, 'input.html')) const metadata = await metascraper({ html, url }) snapshot(metadata) diff --git a/packages/metascraper/test/integration/learnnode/input.html b/packages/metascraper/test/integration/learnnode/input.html new file mode 100644 index 000000000..cbb78ea32 --- /dev/null +++ b/packages/metascraper/test/integration/learnnode/input.html @@ -0,0 +1,895 @@ + + + + Learn Node — The best way to learn Node.js, Express, MongoDB, and Friends + + + + + + + + + + + + + + + + + + + + +
      +
      +

      The best way to learn server-side JavaScript!

      + +

      A premium training course to learn to build apps with Node.js, Express, MongoDB, and friends. +

      Start Learning Now → +
      +
      +
      +
      +
      + +
      +
      +

      Learn to build applications and APIs with Node.js

      +

      Node.js, Express, MongoDB and friends are some of the most in-demand web development skills. This course is the cumulation of everything I've learned building dozens of Node.js applications over the past five years.

      +

      With a focus on modern JavaScript and real world application, Learn Node is an efficient way to add server side JavaScript to your skill-set and start building the applications you have been dreaming about.

      +

      Join me as I show you how to build full stack applications and APIs from start to finish with some of today's top JavaScript technology.

      Buy the Course → +
      +
      +
      +
      +
      +
      +
      +
      +
        +
      • Node.js
      • +
      • MongoDB
      • +
      • Google Maps SDK
      • +
      • Passport JS
      • +
      • Express JS
      • +
      • Sass
      • +
      • Pug
      • +
      • Webpack
      • +
      • ES6
      • +
      • As Seen on TV Logo
      • +
      +
      +
      +
      + +
      +

      Together we will build "Now That's Delicious!", a full stack restaurant application which users can search, geolocate, review and curate their favourite restaurants from around the world.

      +

      The application has three main models — Users, Stores and Reviews — all of which are relational. It is designed to hit upon many of today's application needs such as user authentication, database storage, Ajax REST API, file upload and image resizing.

      +

      Check out the live application here or see a comprehensive listing of all topics covered below.

      +
      +
      +
      Laptop Showing example Application we build in the course + +
      +
      iPhone Showing example Application we build in the course + +
      +
      +
      + +
      +
      +
      +
      +

      Sweet Code! — The code in the application has been reviewed and influenced by some of our industry's best Node.js developers.

      +
      +
      +

      Jed Watson

      +

      JavaScript developer creator of Keystone JS which is a CMS built on top of Express. Elemental UI and Touchstone JS. Co-host of React Sydney and the React Podcast.

      +
      +
      +

      Jamund Ferguson

      +

      JavaScript Engineer at PayPal. Has done a lot of research into async + await with Node.js and is a key advisor to how the error handling is done in this course.

      +
      +
      +
      +
      +
      + +
      +
      Async + Await APIs used in this course
      +
      +

      You'll learn with the latest and greatest updates to JavaScript.

      +

      ES2017 Async + Await allows us to craft easy to read, logical flows without relying on external flow control libraries, chaining multiple promises, or writing spaghetti code by nesting callbacks.

      +

      ES6 features are heavily used throughout the course — from destructuring to arrow functions you'll get to see how to implement these new features in real world scenarios.

      +
      +
      +

      Wondering where the try / catch is in the screenshot? Join the course to see how we handle errors with something called function composition.

      +
      +
      +
      +
      +
      Wes Bos +

      Meet Wes Bos

      +

      Wes Bos is a Full Stack Developer, Speaker and Teacher from Canada. He works as an independent web developer and teaches as a lead instructor with HackerYou. Wes has taught over 500 students in 200+ classes and spoken at dozens of conferences around the world.

      +

      Wes is the author of React For Beginners, ES6 for Everyone and Sublime Text Power User which together have sold over 25,000 copies. He is also the author of JavaScript30.com, LearnRedux.com, Flexbox.io and Command Line Power User, a set of free video series. 145,000 people have taken at least one of Wes' free video courses.

      +
      +
      +
      +
      +
      +
      + +
      +

      Almost anyone who is looking to get stronger with JavaScript. We start beginner and go pretty deep.

      +

      Advanced devs will be able to go through the course a little more quickly, but I've designed this course to be as approachable as possible.

      +

      This course is done in ES6 so there is liberal use of arrow functions, template strings, destructuring and other ES6 goodies. If you haven't done much ES6, you'll have an easier time with the course if you do at least the first half of my ES6 for Everyone course first.

      +

      This isn't JavaScript 101. You should have knowledge of how functions, variables, Objects, Arrays and other fundamentals work.

      +
        +
      • Front End Devs looking to go Full Stack
      • +
      • Existing server side developers looking to understand the Node stack.
      • +
      • WordPress developers looking for a little more control
      • +
      • JS developers looking to advance their career.
      • +
      • Existing Node.js developers looking to fill in any gaps and update to modern workflows and design patterns.
      • +
      • Anyone who wants to get better at JavaScript and learns well from seeing both fundamental and advanced concepts in practice.
      • +
      +
      +

      Not sure if it's for you?

      +

      100% money back if you don't think it's a good fit 💰

      +
      +
      +
      +
      + +
      +

      In each video, we learn and implement a concept into our application. Many of the concepts we return to over and over for different parts of the application, hitting and solving new problems each time.

      +

      This course covers a ton. Along with general JavaScript best practices, here are some of the things you can expect to learn:

      +
        +
      • User Accounts
      • +
      • REST API endpoints
      • +
      • Database Schemas
      • +
      • Document Relationships
      • +
      • Templating and Mixins
      • +
      • Restricting Operations
      • +
      • Middleware
      • +
      • Image Resizing
      • +
      • Password Reset Flow
      • +
      • Storing Geospatial Data
      • +
      • Routing
      • +
      • Flow Control
      • +
      • Error Handling
      • +
      • Advanced DB Queries
      • +
      • File Uploading
      • +
      • Sending Email
      • +
      • MVC Pattern
      • +
      • Geocoding Addresses
      • +
      • Pagination
      • +
      • Server Deployment
      • +
      +
      +
      +
      +

      👌 Video pacing is just right
      fast enough to keep you interested without passing by or assuming any details.

      +

      Seriously, it won't put you to sleep - I'm even funny sometimes.

      +
      +
      +
      +
      +
      FOO
      +
      BAR
      +
      BAZ
      +
      +

      foo? bar? baz? wtf?

      +

      This series was made for humans.
      Our application build covers real world scenarios and solves real world problems.
      100% free of jargon and metasyntactic variables. Foo Yea!

      +
      +
      +
      +
      +
      +
      +
      15Modules
      +
      44Videos
      +
      9.5Hours
      +
      +

      ...and 145,523 words provided with the videos captions
      Incremental, Referenceable and Easy To Digest

      +
      + +
      +

      Each video breaks down a specific part of building a Node application and allows for quick referencing in the future. You can binge watch them all today or do a few each day during your lunch or on your commute.

      +

      Closed Captioning and Transcripts are provided for every video

      +
      +
        +

        Module #1
        Introduction and Setup

        +
      1. +

        Getting Setup

        05:17#1 +
      2. +
      3. +

        Setting up Mongo DB

        09:30#2 +
      4. +
      5. +

        Starter Files and Environmental Variables

        07:35#3 +
      6. +

        Module #2
        Core Concepts

        +
      7. +

        Core Concept - Routing

        10:19#4 +
      8. +
      9. +

        Core Concept - Templating

        16:48#5 +
      10. +
      11. +

        Core Concept - Template Helpers

        06:24#6 +
      12. +
      13. +

        Core Concept - Controllers and the MVC Pattern

        06:49#7 +
      14. +
      15. +

        Core Concept - Middleware and Error Handling

        14:13#8 +
      16. +

        Module #3
        Database Storage

        +
      17. +

        Creating our Store Model

        12:02#9 +
      18. +
      19. +

        Saving Stores and using Mixins

        17:22#10 +
      20. +

        Module #4
        Control Flow

        +
      21. +

        Using Async Await

        17:31#11 +
      22. +
      23. +

        Flash Messages

        10:51#12 +
      24. +
      25. +

        Querying our Database for Stores

        12:37#13 +
      26. +
      27. +

        Creating an Editing Flow for Stores

        20:43#14 +
      28. +

        Module #5
        Geolocation

        +
      29. +

        Saving Lat and Lng for each store

        14:59#15 +
      30. +
      31. +

        Geocoding Data with Google Maps

        10:28#16 +
      32. +
      33. +

        Quick Data Visualization Tip

        04:35#17 +
      34. +

        Module #6
        File Handing and Image Resizing

        +
      35. +

        Uploading and Resizing Images with Middleware

        23:28#18 +
      36. +
      37. +

        Routing and Templating Single Stores

        13:30#19 +
      38. +

        Module #7
        Custom Queries and Hooks

        +
      39. +

        Using Pre-Save hooks to make Unique Slugs

        06:35#20 +
      40. +
      41. +

        Custom MongoDB Aggregations

        17:52#21 +
      42. +
      43. +

        Multiple Query Promises with Async:Await

        07:14#22 +
      44. +

        Module #8
        User Accounts and Authentication

        +
      45. +

        Creating User Accounts

        30:07#23 +
      46. +
      47. +

        Saving Registered Users to the Database

        16:39#24 +
      48. +
      49. +

        Virtual Fields, Login:Logout middleware and Protecting Routes

        10:26#25 +
      50. +
      51. +

        Creating a User Account Edit Screen

        08:04#26 +
      52. +
      53. +

        Password Reset Flow

        24:59#27 +
      54. +

        Module #9
        Advanced - Email and Permissions

        +
      55. +

        Sending email with Nodejs

        19:07#28 +
      56. +
      57. +

        Locking down our application with User Permissions

        14:05#29 +
      58. +

        Module #10
        Ajax REST API 1

        +
      59. +

        Loading Sample Data

        05:10#30 +
      60. +
      61. +

        JSON endpoints and creating MongoDB Indexes

        15:12#31 +
      62. +
      63. +

        Creating an Ajax Search Interface

        26:17#32 +
      64. +

        Module #11
        Ajax REST API 2

        +
      65. +

        Creating a Geospatial Ajax Endpoint

        09:28#33 +
      66. +
      67. +

        Plotting Stores on a Custom Google Map

        26:34#34 +
      68. +

        Module #12
        Ajax REST API 3

        +
      69. +

        Pushing User Data to our API

        23:22#35 +
      70. +
      71. +

        Displaying our Hearted Stores

        03:46#36 +
      72. +

        Module #13
        Advanced Relationships + Aggregations

        +
      73. +

        Adding a Reviews Data Model

        14:09#37 +
      74. +
      75. +

        Advanced Relationship Population - Displaying Our Reviews

        14:13#38 +
      76. +
      77. +

        Advanced Aggregation

        22:51#39 +
      78. +

        Module #14
        Pagination

        +
      79. +

        Implementing Pagination

        12:34#40 +
      80. +

        Module #15
        Deployment

        +
      81. +

        Deployment Setup

        06:24#41 +
      82. +
      83. +

        Deploying to Now

        05:33#42 +
      84. +
      85. +

        Deploying to Heroku

        05:02#43 +
      86. +
      87. +

        Deploying to Digital Ocean Linux

        12:30#44 +
      88. +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +

      Starter Course

      +
        +
      • Access to the first 7 Modules / 22 HD Video Tutorials
      • +
      • Stream course from any device
      • +
      • Source Code — Completed Examples and Exercises
      • +
      • $25 Digital Ocean hosting credit (valid for new Customers only)
      • +
      • Unlimited Updates + Never Expires
      • +
      • SlackExclusive access to the Learn Node Slack Chat Room where you can ask for help and chat with other learners
      • +
      +
      +
      Get the Starter Course + $89$82 +

      Join 15,744 Others!

      +

      +
      +
      +
      +
      +

      Master Package

      +
        +
      • Access to all 15 Modules / 44 HD Videos — see above for a full listing of topics
      • +
      • Stream and Download DRM-free files from any device
      • +
      • Includes Authentication, Sending Email and AJAX REST API
      • +
      • Deployment, Pagination, Advanced Aggregations and more
      • +
      • All Source Code — Completed Examples, Exercises, Webpack files and npm scripts
      • +
      • $25 Digital Ocean hosting credit (valid for new Customers only)
      • +
      • Unlimited Updates + Never Expires
      • +
      • SlackExclusive access to the Learn Node Slack Chat Room where you can ask for help and chat with other learners
      • +
      +
      +
      Get The Master Package + $139$97 +

      15,744 already sold!

      +

      +
      +
      +
      +
      +
      +

      Team License Packages

      +

      With a team license you can buy a number of spots to allocate to employees. The spots do not expire and you can fill the spots via the dashboard whenever you like.

      +

      Perfect for on-boarding new hires, interns and contractors to your tech stack.

      +

      The team license includes everything in the Master Package above.

      +
      +

      For larger groups or for on-site training contact me for more info!

      +
      +
      + +
      +

      All prices in USD

      +
      +
      +
      +
      +
      +

      Worth It?

      Need to convince your Boss?

      +
      +
      +

      I've put over 5 months of my time into this course gaining a deep understanding of each feature, creating examples and distilling it into something that is easy for you to consume.

      +

      This course should take you between 10 and 20 hours to complete versus anywhere from 100 to 400 hours to learn on your own, scraping together resources.

      +

      I've spent the time so you don't have to. Spend a few hours learning Node with me and you'll save yourself hours of Googling and Stack Overflowing in the future. I'll mama bird you the stuff you need to know to keep building the things you make.

      +

      As with all my courses, there is 100% money back if it's not a good fit. Give it a shot!

      +
      +
      +
      +
      +
      + +
      +
      +
      +

      What is the front end written in?

      +

      The interactive parts — search, map, hearting stores and geocoding — are done with Vanilla ES6 JS modules, Axios (AJAX Library) and the Google Maps API. You could totally do these parts of the application in React, Vue, Angular or any other framework that you prefer though it might be a bit overkill.

      +

      The provided styles are written in Sass.

      +

      The templating is written in Pug (formerly named Jade).

      +

      All the front end dependencies are compiled with Webpack.

      +
      +
      +

      Do these videos expire? Is this a monthly cost?

      +

      Nope and nope. Pay once, have them forever.

      +
      +
      +

      Do you provide a certificate of completion?

      +

      Sure do! In your course dashboard you can download an official certificate of completion that can be used to be reimbursed by your employer or land that dream job you are applying for.

      +
      +
      +

      Can I put the code on GitHub? Can I put this app in my portfolio?

      +

      Absolutely - I just ask that you don't create your own course teaching Node.js with this app. Otherwise, go nuts! You can credit my course if you like, but it's not required as you might be using this app to get a job :)

      +
      +
      +

      What other courses do you have?

      +

      I've got a bunch of free and premium web development courses — check out the whole listing over at wesbos.com/courses.

      +
      +
      +

      I lost, deleted or never got my welcome email! What do I do?

      +

      Log into your account, or create an account with the same email you used to buy the series.

      +
      +
      +

      What format are the videos? How do I watch them?

      +

      Once you buy a package, you will be mailed access to your account dashboard where you can stream all the videos. Buyers of the Master Package will also be able to download them for off-line viewing. All the videos were professionally recorded at 1920×1080 with top quality audio — no pops, echoes, chair squeaks, breathing or gross mouth sounds here!

      +
      +
      +

      What if I'm not thrilled?

      +

      I want to make sure you get real value out of this so I only want your money if you are happy with the product! If you aren't satisfied, please send an email to [email protected] with a copy of your welcome email and I will refund you.

      +
      +
      +

      Do you offer a student discount?

      +

      Absolutely! Fill out this form with some proof that you are a student and I'll send you a discount code. This applies to anyone in any type of schooling, including evening classes and coding bootcamps!

      +

      If you have received a student discount for a previous product, it's the same code 😉.

      +
      +
      +

      What theme do you use? What is that font? What terminal do you use? What kind of bread do you buy?

      +

      I've detailed my entire setup over here, feel free to tweet me with any more questions you have about setting things up.

      +
      +
      +

      I have another question!

      +

      Sure - email me at [email protected] or give me a call 416-833-3641!

      +
      +
      +
      + +
      + + +
      +
      × +
      +

      React For Beginners

      +

      Package

      +
      +
      + + +
      +
      +
      +
      + +
      +
      + + + + + +
      +
      + + + + + +
      +
      + +
      +
      + +
      + +

      Secure SSL Payment via Stripe

      +
      +
      +
      + + +
      +
      + +
      +
      + +
      +

      Secure SSL Payment via PayPal

      +
      +
      +
      +
      +
      + + + + + + + + +