From 4dfc92d2254bd5e8ba6ec569c243276a8dc44927 Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sat, 12 Mar 2022 20:32:17 +0530 Subject: [PATCH 001/225] Update README.md --- README.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/README.md b/README.md index 5a36c4e..cab4a24 100644 --- a/README.md +++ b/README.md @@ -3728,6 +3728,55 @@ console.log(hashPwd); //ef5225a03e4f9cc953ab3c4dd41f5c4db7dc2e5b ↥ back to top +## Q. ***How to Validate Data using joi Module in Node.js?*** + +Joi module is a popular module for data validation. This module validates the data based on schemas. There are various functions like `optional(), required(), min(), max(), etc which make it easy to use and a user-friendly module for validating the data. + +```js +const Joi = require("joi"); + +//User-defined function to validate the user +function validateUser(user) { + + const JoiSchema = Joi.object({ + + username: Joi.string().min(5).max(30).required(), + + email: Joi.string().email().min(5).max(50).optional(), + + date_of_birth: Joi.date().optional(), + + account_status: Joi.string() + .valid("activated") + .valid("unactivated") + .optional(), + }).options({ abortEarly: false }); + + return JoiSchema.validate(user); +} + +const user = { + username: "Deepak Lucky", + email: "deepak.lucky@gmail.com", + date_of_birth: "2000-07-07", + account_status: "activated", +}; + +let response = validateUser(user); + +if (response.error) { + console.log(response.error.details); +} else { + console.log("Validated Data"); +} +``` + +**⚝ [Try this example on CodeSandbox](https://codesandbox.io/s/schema-validation-using-joi-s2nhzs)** + +
+ ↥ back to top +
+ #### Q. ***Is it possible to use "Class" in Node.js?*** #### Q. ***Explain Error Handling approaches in Node.js?*** #### Q. ***How would you handle errors for async code in Node.js?*** From 381f3dd473fe850ba9fda6cc8b56725d40dadaf3 Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sun, 13 Mar 2022 10:45:30 +0530 Subject: [PATCH 002/225] Middleware functions --- README.md | 61 ++++++++++++++++++++++++++++++++++++++++++ assets/express-mw.png | Bin 0 -> 158065 bytes 2 files changed, 61 insertions(+) create mode 100644 assets/express-mw.png diff --git a/README.md b/README.md index cab4a24..1c637ff 100644 --- a/README.md +++ b/README.md @@ -3777,6 +3777,67 @@ if (response.error) { ↥ back to top +## Q. ***What are the middleware functions in Node.js?*** + +Middleware functions are functions that have access to the **request object (req)**, the **response object (res)**, and the `next` function in the application\'s request-response cycle. + +The `next` function is a function in the Express router which, when invoked, executes the middleware succeeding the current middleware. + +Middleware functions can perform the following tasks: + +* Execute any code. +* Make changes to the request and the response objects. +* End the request-response cycle. +* Call the next middleware in the stack. + +If the current middleware function does not end the request-response cycle, it must call `next()` to pass control to the next middleware function. Otherwise, the request will be left hanging. + +The following figure shows the elements of a middleware function call: + +

+ Middleware functions +

+ +Middleware functions that return a Promise will call `next(value)` when they reject or throw an error. `next` will be called with either the rejected value or the thrown Error. + +
+ ↥ back to top +
+ +## Q. ***Explain the use of next in node.js with example?*** + +The next function is a function in the Express router which, when invoked, executes the middleware succeeding the current middleware. + +**Example:** Middleware function myLogger + +To load the middleware function, call `app.use()`, specifying the middleware function. For example, the following code loads the **myLogger** middleware function before the route to the root path (/). + +```js +const express = require("express"); +const app = express(); + +const myLogger = function (req, res, next) { + console.log("LOGGED"); + next(); +}; + +app.use(myLogger); + +app.get("/", (req, res) => { + res.send("Hello World!"); +}); + +app.listen(3000); +``` + +**⚝ [Try this example on CodeSandbox](https://codesandbox.io/s/next-function-nq042s)** + +*Note: The `next()` function is not a part of the Node.js or Express API, but is the third argument that is passed to the middleware function. The `next()` function could be named anything, but by convention it is always named “next”. To avoid confusion, always use this convention.* + +
+ ↥ back to top +
+ #### Q. ***Is it possible to use "Class" in Node.js?*** #### Q. ***Explain Error Handling approaches in Node.js?*** #### Q. ***How would you handle errors for async code in Node.js?*** diff --git a/assets/express-mw.png b/assets/express-mw.png new file mode 100644 index 0000000000000000000000000000000000000000..82763a3a522a6e44f395d6fa5741db16324fe4bc GIT binary patch literal 158065 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

vI6S6whwbAHnrG*eVVVG>V*> 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

w##bxIQG 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

*x&2yjW2^j^=GCZ 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 Date: Sun, 13 Mar 2022 10:47:12 +0530 Subject: [PATCH 003/225] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 1c637ff..ce9b890 100644 --- a/README.md +++ b/README.md @@ -3781,8 +3781,6 @@ if (response.error) { Middleware functions are functions that have access to the **request object (req)**, the **response object (res)**, and the `next` function in the application\'s request-response cycle. -The `next` function is a function in the Express router which, when invoked, executes the middleware succeeding the current middleware. - Middleware functions can perform the following tasks: * Execute any code. From b76b63fd2c1f818acfbe2c42b33965f9e0574efb Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sun, 13 Mar 2022 11:41:05 +0530 Subject: [PATCH 004/225] Update README.md --- README.md | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index ce9b890..cdcc193 100644 --- a/README.md +++ b/README.md @@ -3517,9 +3517,7 @@ The `jwt.sign()` method takes a payload, private key defined in `./certs/accessT ## Q. ***How to build a microservices architecture with Node.js?*** -**Microservices** - -Microservices are a style of **service-oriented architecture** (SOA) where the app is structured on an assembly of interconnected services. With microservices, the application architecture is built with lightweight protocols. The services are finely seeded in the architecture. Microservices disintegrate the app into smaller services and enable improved modularity. +Microservices are a style of **Service Oriented Architecture (SOA)** where the app is structured on an assembly of interconnected services. With microservices, the application architecture is built with lightweight protocols. The services are finely seeded in the architecture. Microservices disintegrate the app into smaller services and enable improved modularity.

Microservices @@ -3527,17 +3525,17 @@ Microservices are a style of **service-oriented architecture** (SOA) where the a There are few things worth emphasizing about the superiority of microservices, and distributed systems generally, over monolithic architecture: -* Modularity — responsibility for specific operations is assigned to separate pieces of the application -* Uniformity — microservices interfaces (API endpoints) consist of a base URI identifying a data object and standard HTTP methods (GET, POST, PUT, PATCH and DELETE) used to manipulate the object -* Robustness — component failures cause only the absence or reduction of a specific unit of functionality -* Maintainability — system components can be modified and deployed independently -* Scalability — instances of a service can be added or removed to respond to changes in demand. -* Availability — new features can be added to the system while maintaining 100% availability. -* Testability — new solutions can be tested directly in the production environment by implementing them for restricted segments of users to see how they behave in real life. +* **Modularity** — responsibility for specific operations is assigned to separate pieces of the application +* **Uniformity** — microservices interfaces (API endpoints) consist of a base URI identifying a data object and standard HTTP methods (GET, POST, PUT, PATCH and DELETE) used to manipulate the object +* **Robustness** — component failures cause only the absence or reduction of a specific unit of functionality +* **Maintainability** — system components can be modified and deployed independently +* **Scalability** — instances of a service can be added or removed to respond to changes in demand. +* **Availability** — new features can be added to the system while maintaining 100% availability. +* **Testability** — new solutions can be tested directly in the production environment by implementing them for restricted segments of users to see how they behave in real life. -**Creating Microservices with Node.js** +**Example:** Creating Microservices with Node.js -**Step 01: Creating a Server to Accept Requests** +**Step 01:** Creating a Server to Accept Requests This file is creating our server and assigns routes to process all requests. @@ -3555,7 +3553,7 @@ app.listen(port, function() { }); ``` -**Step 02: Defining the routes** +**Step 02:** Defining the routes The next step is to define the routes for the microservices and then assign each to a target in the controller. We have two endpoints. One endpoint called "about" that returns information about the application. And a "distance" endpoint that includes two path parameters, both Zip Codes of the Lego store. This endpoint returns the distance, in miles, between these two Zip Codes. @@ -3570,7 +3568,7 @@ module.exports = function(app) { }; ``` -**Step 03: Adding Controller Logic** +**Step 03:** Adding Controller Logic Within the controller file, we are going to create a controller object with two properties. Those properties are the functions to handle the requests we defined in the routes module. From 64e98e19f40a365b7390a6f1ca51d80824fef9d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Apr 2022 09:32:08 +0000 Subject: [PATCH 005/225] Bump minimist in /jwt-asymmetric-cryptography-authentication Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jwt-asymmetric-cryptography-authentication/package-lock.json b/jwt-asymmetric-cryptography-authentication/package-lock.json index cfa64fe..63417a5 100644 --- a/jwt-asymmetric-cryptography-authentication/package-lock.json +++ b/jwt-asymmetric-cryptography-authentication/package-lock.json @@ -1166,9 +1166,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/ms": { @@ -2752,9 +2752,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "ms": { From 6f600fedab21ab161c5cf932c2a8f8e6d26fecb5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Apr 2022 01:21:35 +0000 Subject: [PATCH 006/225] Bump ansi-regex from 3.0.0 to 3.0.1 in /jwt-authentication Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/chalk/ansi-regex/releases) - [Commits](https://github.com/chalk/ansi-regex/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: ansi-regex dependency-type: indirect ... Signed-off-by: dependabot[bot] --- jwt-authentication/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jwt-authentication/package-lock.json b/jwt-authentication/package-lock.json index dd6e18f..7b086fe 100644 --- a/jwt-authentication/package-lock.json +++ b/jwt-authentication/package-lock.json @@ -29,9 +29,9 @@ } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "ansi-styles": { From 750b440714faec47823516a7153f442b7a4cde43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Apr 2022 01:21:52 +0000 Subject: [PATCH 007/225] Bump minimist from 1.2.5 to 1.2.6 in /jwt-authentication Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- jwt-authentication/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jwt-authentication/package-lock.json b/jwt-authentication/package-lock.json index dd6e18f..760fd39 100644 --- a/jwt-authentication/package-lock.json +++ b/jwt-authentication/package-lock.json @@ -1422,9 +1422,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mixin-deep": { From d0351e7d0b0b45653257b3b7f908de10a8fbf2ab Mon Sep 17 00:00:00 2001 From: Mert Acar Date: Sun, 15 May 2022 14:58:20 +0100 Subject: [PATCH 008/225] Fix deprecation and spelling --- README.md | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index cdcc193..ab63d33 100644 --- a/README.md +++ b/README.md @@ -988,41 +988,40 @@ When the EventEmitter object emits an event, all of the functions attached to th *Example*: ```javascript -var events = require('events'); -var eventEmitter = new events.EventEmitter(); +const events = require('events'); +const eventEmitter = new events.EventEmitter(); // listener #1 -var listner1 = function listner1() { - console.log('listner1 executed.'); +const listener1 = function listener1() { + console.log('listener1 executed.'); } // listener #2 -var listner2 = function listner2() { - console.log('listner2 executed.'); +const listener2 = function listener2() { + console.log('listener2 executed.'); } -// Bind the connection event with the listner1 function -eventEmitter.addListener('connection', listner1); +// Bind the connection event with the listener1 function +eventEmitter.addListener('connection', listener1); -// Bind the connection event with the listner2 function -eventEmitter.on('connection', listner2); +// Bind the connection event with the listener2 function +eventEmitter.on('connection', listener2); -var eventListeners = require('events').EventEmitter.listenerCount - (eventEmitter,'connection'); -console.log(eventListeners + " Listner(s) listening to connection event"); +let eventListeners = eventEmitter.listenerCount('connection') +console.log(eventListeners + " Listener(s) listening to connection event"); // Fire the connection event eventEmitter.emit('connection'); -// Remove the binding of listner1 function -eventEmitter.removeListener('connection', listner1); -console.log("Listner1 will not listen now."); +// Remove the binding of listener1 function +eventEmitter.removeListener('connection', listener1); +console.log("Listener1 will not listen now."); // Fire the connection event eventEmitter.emit('connection'); -eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection'); -console.log(eventListeners + " Listner(s) listening to connection event"); +eventListeners = eventEmitter.listenerCount('connection') +console.log(eventListeners + " Listener(s) listening to connection event"); console.log("Program Ended."); ``` @@ -1036,12 +1035,12 @@ $ node main.js Output ```bash -2 Listner(s) listening to connection event -listner1 executed. -listner2 executed. -Listner1 will not listen now. -listner2 executed. -1 Listner(s) listening to connection event +2 Listener(s) listening to connection event +listener1 executed. +listener2 executed. +Listener1 will not listen now. +listener2 executed. +1 Listener(s) listening to connection event Program Ended. ``` From d0a6cc720f77bd0fab1eee5077cc1adc0676b9fe Mon Sep 17 00:00:00 2001 From: Pranav Pratap Singh <56934594+Pranav108@users.noreply.github.com> Date: Sun, 26 Jun 2022 14:40:42 +0530 Subject: [PATCH 009/225] fixed typo Fixed a few typos near line 557 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ab63d33..096022a 100644 --- a/README.md +++ b/README.md @@ -513,8 +513,8 @@ async.waterfall([ The 1st parameter passed in callback. @null or @undefined or @false control moves to the next function in the array - if @true or @string the control is immedeatly moved - to the final callback fucntion + if @true or @string the control is immediately moved + to the final callback function rest of the functions in the array would not be executed */ @@ -554,7 +554,7 @@ async.series([ @null or @undefined or @false control moves to the next function in the array if @true or @string the control is immedeatly moved - to the final callback fucntion with the value of err same as + to the final callback function with the value of err same as passed over here and rest of the functions in the array would not be executed From 2a98762bfa188a5865f844e2d748caab15980b0a Mon Sep 17 00:00:00 2001 From: Muhammad Ramzan Date: Fri, 8 Jul 2022 11:06:59 +0500 Subject: [PATCH 010/225] Update README.md Fixed Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 096022a..dd8bede 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ From a web server development perspective Node has a number of benefits: * Code is written in "plain old JavaScript", which means that less time is spent dealing with "context shift" between languages when you're writing both client-side and server-side code. - * JavaScript is a relatively new programming languages and benefits from improvements in language design when compared to other traditional web-server languages (e.g. Python, PHP, etc.) Many other new and pouplar languages compile/convert into JavaScript so you can use TypeScript, CoffeeScript, ClojureScript, Scala, LiveScript, etc. + * JavaScript is a relatively new programming language and benefits from improvements in language design when compared to other traditional web-server languages (e.g. Python, PHP, etc.) Many other new and pouplar languages compile/convert into JavaScript so you can use TypeScript, CoffeeScript, ClojureScript, Scala, LiveScript, etc. * The node package manager (NPM) provides access to hundres of thousands of resuable packages. It also has best-in-class dependency resolution and can also be used to automate most of the build toolchain. From 250f5d09cd9103a0007dbad8103f8bfd06836a80 Mon Sep 17 00:00:00 2001 From: Muhammad Ramzan Date: Fri, 8 Jul 2022 11:20:11 +0500 Subject: [PATCH 011/225] Update README.md Fixed Typo --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 096022a..d9a2e76 100644 --- a/README.md +++ b/README.md @@ -300,11 +300,13 @@ req.end() ## Q. ***How to execute an external program from within Node.js?*** +```js const { exec } = require('child_process'); exec('"/path/to/test file/test.sh" arg1 arg2'); exec('echo "The \\$HOME variable is $HOME"'); +```

↥ back to top From 7e5672b8b960c516d63e3ca486fae32d1c967ff7 Mon Sep 17 00:00:00 2001 From: WOLFIEEEE Date: Mon, 11 Jul 2022 10:45:32 +0530 Subject: [PATCH 012/225] Answering Qestion ( How Node Js is concurrent) --- README.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 392c250..be8b532 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ | 13. |[What is a test pyramid? How can you implement it when talking about HTTP APIs?](#q-what-is-a-test-pyramid-how-can-you-implement-it-when-talking-about-http-apis)| | 14. |[How can you secure your HTTP cookies against XSS attacks?](#q-how-can-you-secure-your-http-cookies-against-xss-attacks)| | 15. |[How can you make sure your dependencies are safe?](#q-how-can-you-make-sure-your-dependencies-are-safe)| -| 16. |[What is Event loop in Node.js? How does it work?](#q-what-is-event-loop-in-nodejs-how-does-it-work)| +| 16. |[What is Event loop in Node.js? How does it work?](#q-what-is-event-loop-in-nodejs-how-does-it-work)| | 17. |[What is REPL? What purpose it is used for?](#q-what-is-repl-what-purpose-it-is-used-for)| | 18. |[What is the difference between Asynchronous and Non-blocking?](#q-what-is-the-difference-between-asynchronous-and-non-blocking)| | 19. |[How to debug an application in Node.js?](#q-how-to-debug-an-application-in-nodejs)| @@ -832,7 +832,25 @@ console.log("Program Ended."); ## Q. ***If Node.js is single threaded then how it handles concurrency?*** -*ToDo* +Node js despite being single-threaded is the asynchronous nature that makes it possible to handle concurrency and perform multiple I/O operations at the same time. Node js uses an event loop to maintain concurrency and perform non-blocking I/O operations. + +As soon as Node js starts, it initializes an event loop. The event loop works on a queue (which is called an event queue) and performs tasks in FIFO(First In First Out) order. It executes a task only when there is no ongoing task in the call stack. The call stack works in LIFO(Last In First Out) order. The event loop continuously checks the call stack to check if there is any task that needs to be run. Now whenever the event loop finds any function, it adds it to the stack and runs in order. + +```javascript +function add(a,b){ + return a+b; +} +function print(n){ + console.log(`Two times the number ${n} is `+add(n,n)); +} + +print(5); +``` + + Here, when the code executes, the function print(5) will be invoked and will push into the call stack. When the function is called, it starts consoling the statement inside it but before consoling the whole statement it encounters another function add(n,n) and suspends its current execution, and pushes the add function into the top of the call stack. Now the function will return the addition a+b and then popped out from the stack and now the previously suspended function will start running and will log the output to console and then this function too will get pop from the stack and now the stack is empty. So this is how a call stack works. + + Source :- GeeksForGeeks +
↥ back to top From 4df4cc691a53c7dca7e98ceb9001b379549be2c8 Mon Sep 17 00:00:00 2001 From: WOLFIEEEE Date: Mon, 11 Jul 2022 10:45:54 +0530 Subject: [PATCH 013/225] Adding Question Number --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index be8b532..479609d 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ | 79. |[What is Callback function in node.js?](#q-what-is-callback-function-in-nodejs)| | 80. |[What is asynchronous programming in node.js?](#q-what-is-asynchronous-programming-in-nodejs)| | 81. |[How to implement asymmetric cryptography when signing and verify JSON Web Token (JWT) for authentication in node js?](#q-how-to-implement-asymmetric-cryptography-when-signing-and-verifying-json-web-token-jwt-for-authentication-in-node-js) | +| 82. |[If Node.js is single threaded then how it handles concurrency?](#q-if-nodejs-is-single-threaded-then-how-it-handles-concurrency)
From 18091718d05d2c0c285ec7bf91e2c8401bd521db Mon Sep 17 00:00:00 2001 From: Hugo B Date: Mon, 1 Aug 2022 15:51:31 +0200 Subject: [PATCH 014/225] Correct README typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 479609d..a99ebf9 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ From a web server development perspective Node has a number of benefits: * Code is written in "plain old JavaScript", which means that less time is spent dealing with "context shift" between languages when you're writing both client-side and server-side code. - * JavaScript is a relatively new programming language and benefits from improvements in language design when compared to other traditional web-server languages (e.g. Python, PHP, etc.) Many other new and pouplar languages compile/convert into JavaScript so you can use TypeScript, CoffeeScript, ClojureScript, Scala, LiveScript, etc. + * JavaScript is a relatively new programming language and benefits from improvements in language design when compared to other traditional web-server languages (e.g. Python, PHP, etc.) Many other new and popular languages compile/convert into JavaScript so you can use TypeScript, CoffeeScript, ClojureScript, Scala, LiveScript, etc. * The node package manager (NPM) provides access to hundres of thousands of resuable packages. It also has best-in-class dependency resolution and can also be used to automate most of the build toolchain. From 0d0f1a4ac18ab9d0750c0bf56c92963638d05980 Mon Sep 17 00:00:00 2001 From: Lucas Gouvea da Silva Carvalho Date: Mon, 1 Aug 2022 19:44:59 -0300 Subject: [PATCH 015/225] [chore] Fixing typo in CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a72db6..f4669b3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,7 +34,7 @@ Where: - Bug: For changes fixing a bug, typo or anything that leads to correctness of the system being worked on - Buggy: Should be avoided as much as possible but could be needed. It is used when changes have been partially implemented and execution of the current state of the project would lead to evil bugs and sinister errors. An example refers to unclosed tags and a hurried commit since you might not get access to your PC for a while. Projects with this commit type as the latest one should perhaps not be pulled or cloned except such implementation is to be continued by you. -- Message: refers to a message describing the changes made. It is important that each commit should only reflect one feature or implementation change. You should not cram two functionalities into one commit except they depend closely on one another. For example, implmentation of auth and adding views for a user profile are closely related but do not inter-depend on one another and should be separated into different commits. This is just to ensure a dev could work with states that are narrowed down to specific implementations and features. +- Message: refers to a message describing the changes made. It is important that each commit should only reflect one feature or implementation change. You should not cram two functionalities into one commit except they depend closely on one another. For example, implementation of auth and adding views for a user profile are closely related but do not inter-depend on one another and should be separated into different commits. This is just to ensure a dev could work with states that are narrowed down to specific implementations and features. ## FAQ From e2dde36031e3ce0dea50dbe73e87640910d62737 Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sat, 20 Aug 2022 12:45:25 +0530 Subject: [PATCH 016/225] Update README.md --- README.md | 119 +++++++++++++----------------------------------------- 1 file changed, 29 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index a99ebf9..fb62190 100644 --- a/README.md +++ b/README.md @@ -2,101 +2,37 @@ *Click if you like the project. Pull Requests are highly appreciated.* -## Table of Contents +## Related Interview Questions -* *[NodeJS APIs](nodejs-api.md)* -* *[NodeJS Coding Practice](nodejs-programming.md)* -* *[NodeJS Commands](nodejs-commands.md)* +* [HTML5 Interview Questions](https://github.com/learning-zone/html-interview-questions/blob/master/README.md) +* [CSS Interview Questions](https://github.com/learning-zone/css-interview-questions/blob/master/README.md) +* [JavaScript Interview Questions](https://github.com/learning-zone/javascript-interview-questions/blob/master/README.md) +* [Node.js APIs](nodejs-api.md) +* [Node.js Coding Practice](nodejs-programming.md) +* [Node.js Commands](nodejs-commands.md)
-| Sl.No| Questions | -|------|------------------| -| 01. |[What does the runtime environment mean in Node.js?](#q-what-does-the-runtime-environment-mean-in-nodejs)| -| 02. |[What is Node.js?](#q-what-is-nodejs)| -| 03. |[What is Node.js Process Model?](#q-what-is-nodejs-process-model)| -| 04. |[What are the data types in Node.js?](#q-what-are-the-data-types-in-nodejs)| -| 05. |[How to create a simple server in Node.js that returns Hello World?](#q-how-to-create-a-simple-server-in-nodejs-that-returns-hello-world)| -| 06. |[How do Node.js works?](#q-how-do-nodejs-works)| -| 07. |[What is an error-first callback?](#q-what-is-an-error-first-callback)| -| 08. |[What is callback hell in Node.js?](#q-what-is-callback-hell-in-nodejs)| -| 09. |[What are Promises in Node.js?](#q-what-are-promises-in-nodejs)| -| 10. |[What tools can be used to assure consistent style?](#q-what-tools-can-be-used-to-assure-consistent-style)| -| 11. |[When should you npm and when yarn?](#q-when-should-you-npm-and-when-yarn)| -| 12. |[What is a stub?](#q-what-is-a-stub)| -| 13. |[What is a test pyramid? How can you implement it when talking about HTTP APIs?](#q-what-is-a-test-pyramid-how-can-you-implement-it-when-talking-about-http-apis)| -| 14. |[How can you secure your HTTP cookies against XSS attacks?](#q-how-can-you-secure-your-http-cookies-against-xss-attacks)| -| 15. |[How can you make sure your dependencies are safe?](#q-how-can-you-make-sure-your-dependencies-are-safe)| -| 16. |[What is Event loop in Node.js? How does it work?](#q-what-is-event-loop-in-nodejs-how-does-it-work)| -| 17. |[What is REPL? What purpose it is used for?](#q-what-is-repl-what-purpose-it-is-used-for)| -| 18. |[What is the difference between Asynchronous and Non-blocking?](#q-what-is-the-difference-between-asynchronous-and-non-blocking)| -| 19. |[How to debug an application in Node.js?](#q-how-to-debug-an-application-in-nodejs)| -| 20. |[What are some of the most popular packages of Node.js?](#q-what-are-some-of-the-most-popular-packages-of-nodejs)| -| 21. |[What is EventEmitter in Node.js?](#q-what-is-eventemitter-in-nodejs)| -| 22. |[How many types of streams are present in node.js?](#q-how-many-types-of-streams-are-present-in-nodejs)| -| 23. |[What is crypto in Node.js? How do you cipher the secure information in Node.js?](#q-what-is-crypto-in-nodejs-how-do-you-cipher-the-secure-information-in-nodejs)| -| 24. |[What is the use of DNS module in Node.js?](#q-what-is-the-use-of-dns-module-in-nodejs)| -| 25. |[What are the security mechanisms available in Node.js?](#q-what-are-the-security-mechanisms-available-in-nodejs)| -| 26. |[Name the types of API functions in Node.js.](#q-name-the-types-of-api-functions-in-nodejs) -| 27. |[How does Node.js handle child threads?](#q-how-does-nodejs-handle-child-threads)| -| 28. |[What is the preferred method of resolving unhandled exceptions in Node.js?](#q-what-is-the-preferred-method-of-resolving-unhandled-exceptions-in-nodejs)| -| 29. |[How does Node.js support multi-processor platforms, and does it fully utilize all processor resources?](#q-how-does-nodejs-support-multi-processor-platforms-and-does-it-fully-utilize-all-processor-resources)| -| 30. |[What is typically the first argument passed to a Node.js callback handler?](#q-what-is-typically-the-first-argument-passed-to-a-nodejs-callback-handler)| -| 31. |[How Node.js read the content of a file?](#q-how-nodejs-read-the-content-of-a-file)| -| 32. |[What is JIT and how is it related to Node.js?](#q-what-is-jit-and-how-is-it-related-to-nodejs)| -| 33. |[What is difference between put and patch?](#q-what-is-difference-between-put-and-patch)| -| 34. |[List types of Http requests supported by Node.js.](#q-list-types-of-http-requests-supported-by-nodejs) -| 35. |[Why to use Express.js?](#q-why-to-use-expressjs)| -| 36. |[Write the steps for setting up an Express JS application.](#q-write-the-steps-for-setting-up-an-express-js-application) -| 37. |[Since node is a single threaded process, how to make use of all CPUs?](#q-since-node-is-a-single-threaded-process-how-to-make-use-of-all-cpus)| -| 38. |[What does emitter do and what is dispatcher?](#q-what-does-emitter-do-and-what-is-dispatcher)| -| 39. |[How to kill child processes that spawn their own child processes in Node.js?](#q-how-to-kill-child-processes-that-spawn-their-own-child-processes-in-nodejs)| -| 40. |[What do you understand by Reactor Pattern in Node.js?](#q-what-do-you-understand-by-reactor-pattern-in-nodejs)| -| 41. |[What are the key features of Node.js?](#q-what-are-the-key-features-of-nodejs)| -| 42. |[What are globals in Node.js?](#q-what-are-globals-in-nodejs)| -| 43. |[What is chaining process in Node.js?](#q-what-is-chaining-process-in-nodejs)| -| 44. |[What is a control flow function? what are the steps does it execute?](#q-what-is-a-control-flow-function-what-are-the-steps-does-it-execute)| -| 45. |[What is npm in Node.js?](#q-what-is-npm-in-nodejs)| -| 46. |[When to use Node.js and when not to use it?](#q-when-to-use-nodejs-and-when-not-to-use-it)| -| 47. |[Explain how does Node.js work?](#q-explain-how-does-nodejs-work)| -| 48. |[Is Node.js entirely based on a single-thread?](#q-is-nodejs-entirely-based-on-a-single-thread)| -| 49. |[How to make post request in Node.js?](#q-how-to-make-post-request-in-nodejs)| -| 50. |[Can you create http server in Node.js, explain the code used for it?](#q-can-you-create-http-server-in-nodejs-explain-the-code-used-for-it)| -| 51. |[How to load html in Node.js?](#q-how-to-load-html-in-nodejs)| -| 52. |[How can you listen on port 80 with Node?](#q-how-can-you-listen-on-port-80-with-node)| -| 53. |[What is the difference between operational and programmer errors?](#q-what-is-the-difference-between-operational-and-programmer-errors)| -| 54. |[Why npm shrinkwrap is useful?](#q-why-npm-shrinkwrap-is-useful)| -| 55. |[What is your favourite HTTP framework and why?](#q-what-is-your-favourite-http-framework-and-why)| -| 56. |[What are the Challenges with Node.js?](#q-what-are-the-challenges-with-nodejs)| -| 57. |[What is the difference between Node.js vs Ajax?](#q-what-is-the-difference-between-nodejs-vs-ajax)| -| 58. |[How Node.js overcomes the problem of blocking of I/O operations?](#q-how-nodejs-overcomes-the-problem-of-blocking-of-i-o-operations)| -| 59. |[Mention the steps by which you can async in Node.js?](#q-mention-the-steps-by-which-you-can-async-in-nodejs)| -| 60. |[What are the timing features of Node.js?](#q-what-are-the-timing-features-of-nodejs)| -| 61. |[What is LTS releases of Node.js why should you care?](#q-what-is-lts-releases-of-nodejs-why-should-you-care)| -| 62. |[Why should you separate Express 'app' and 'server'?](#q-why-should-you-separate-express-app-and-server)| -| 63. |[What is the difference between process.nextTick() and setImmediate()?](#q-what-is-the-difference-between-processnexttick-and-setimmediate)| -| 64. |[What is difference between JavaScript and Node.js?](#q-what-is-difference-between-javascript-and-nodejs)| -| 65. |[What are the difference between Events and Callbacks?](#q-what-are-the-difference-between-events-and-callbacks)| -| 66. |[Explain RESTful Web Services in Node.js?](#q-explain-restful-web-services-in-nodejs)| -| 67. |[How to handle file upload in Node js?](#q-how-to-handle-file-upload-in-node-js)| -| 68. |[Explain the terms body-parser, cookie-parser, debug, jade, morgan, nodemon, pm2, serve-favicon, cors in Express JS?](#q-explain-the-terms-body-parser-cookie-parser-debug-jade-morgan-nodemon-pm2-serve-favicon-cors-in-express-js)| -| 69. |[How does routing work in Node.js](#q-how-does-routing-work-in-node-js)| -| 70. |[How Node prevents blocking code?](#q-how-node-prevents-blocking-code)| -| 71. |[What is difference between promise and async await in node js?](#q-what-is-difference-between-promise-and-async-await-in-node-js)| -| 72. |[How to use JSON Web Token (JWT) for authentication in node js?](#q-how-to-use-json-web-token-jwt-for-authentication-in-node-js)| -| 73. |[How to build a microservices architecture with node js?](#q-how-to-build-a-microservices-architecture-with-node-js)| -| 74. |[How to use Q promise in node js?](#q-how-to-use-q-promise-in-node-js)| -| 75. |[How to use locale (i18n) in node js?](#q-how-to-use-locale-i18n-in-node-js)| -| 76. |[How to Implement Memcached in Nodejs?](#q-how-to-implement-memcached-in-nodejs)| -| 77. |[Explain Error Handling approaches in Nodejs?](#q-explain-error-handling-approaches-in-nodejs)| -| 78. |[How to generate and verify checksum of the given string in Nodejs](#q-how-to-generate-and-verify-checksum-of-the-given-string-in-nodejs)| -| 79. |[What is Callback function in node.js?](#q-what-is-callback-function-in-nodejs)| -| 80. |[What is asynchronous programming in node.js?](#q-what-is-asynchronous-programming-in-nodejs)| -| 81. |[How to implement asymmetric cryptography when signing and verify JSON Web Token (JWT) for authentication in node js?](#q-how-to-implement-asymmetric-cryptography-when-signing-and-verifying-json-web-token-jwt-for-authentication-in-node-js) | -| 82. |[If Node.js is single threaded then how it handles concurrency?](#q-if-nodejs-is-single-threaded-then-how-it-handles-concurrency) +## Table of Contents + +* [Introduction](#-1-introduction) +* [Node.js Setup](#-2-nodejs-setup) +* [Node.js Events](#-3-nodejs-events) +* [Node.js File System](#-4-nodejs-file-system) +* [Node.js Streams](#-5-nodejs-streams) +* [Node.js Web Module](#-6-nodejs-web-module) +* [Node.js Middleware](#-7-nodejs-middleware) +* [Node.js RESTFul API](#-8-nodejs-restful-api) +* [Node.js Routing](#-9-nodejs-routing) +* [Node.js Error Handling](#-10-nodejs-error-handling) +* [Node.js Logging](#-11-nodejs-logging) +* [Node.js Testing](#-12-nodejs-testing)
+## # 1. INTRODUCTION + +
## Q. ***What is Node.js?*** @@ -162,12 +98,14 @@ Just like JS, there are two categories of data types in Node: Primitives and Obj * other regular objects - - +## # 2. NODEJS SETUP + +
+ ## Q. ***How to create a simple server in Node.js that returns Hello World?*** **Step 01**: Create a project directory @@ -252,6 +190,7 @@ console.log(qdata.month); //returns 'september' ↥ back to top
+## # 3. NODEJS EVENTS ## Q. ***How to make an HTTP POST request using Node.js?*** From f49a83a901b45bcb48face300d7b8b87d48f3cdb Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sat, 20 Aug 2022 12:47:08 +0530 Subject: [PATCH 017/225] Update README.md --- README.md | 196 +++++++++++++++++++++++++++--------------------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index fb62190..cbb5128 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Node.js is an open-source server side runtime environment built on Chrome\'s V8 JavaScript engine. It provides an event driven, non-blocking (asynchronous) I/O and cross-platform runtime environment for building highly scalable server-side applications using JavaScript. ## Q. ***What are the benefits of using Node.js?*** @@ -62,7 +62,7 @@ From a web server development perspective Node has a number of benefits: ## Q. ***What is Node.js Process Model?*** @@ -70,7 +70,7 @@ From a web server development perspective Node has a number of benefits: Node.js runs in a single process and the application code runs in a single thread and thereby needs less resources than other platforms. All the user requests to your web application will be handled by a single thread and all the I/O work or long running job is performed asynchronously for a particular request. So, this single thread doesn't have to wait for the request to complete and is free to handle the next request. When asynchronous I/O work completes then it processes the request further and sends the response. ## Q. ***What are the data types in Node.js?*** @@ -99,7 +99,7 @@ Just like JS, there are two categories of data types in Node: Primitives and Obj * other regular objects ## # 2. NODEJS SETUP @@ -161,7 +161,7 @@ node app.js ``` ## Q. ***Explain the concept of URL module in Node.js?*** @@ -187,7 +187,7 @@ console.log(qdata.month); //returns 'september' ``` ## # 3. NODEJS EVENTS @@ -235,7 +235,7 @@ req.end() ``` ## Q. ***How to execute an external program from within Node.js?*** @@ -249,7 +249,7 @@ exec('echo "The \\$HOME variable is $HOME"'); ``` ## Q. ***What does the runtime environment mean in Node.js?*** @@ -266,7 +266,7 @@ The runtime environment is literally just the environment your application is ru ## Q. ***Explain usage of NODE_ENV?*** @@ -287,7 +287,7 @@ Upon that, if the project runs on production it will use caching. ## Q. ***How do Node.js works?*** @@ -322,7 +322,7 @@ Node JS Platform does not follow Request/Response Multi-Threaded Stateless Model * Event Loop in turn, sends that Response to the respective Client. ## Q. ***What is the difference between Node.js, AJAX, and JQuery?*** @@ -334,7 +334,7 @@ Asynchronous JavaScript and XML(AJAX) refers to group of technologies that we us Jquery is a simple javascript library that helps us with front-end development. ## Q. ***What are the core modules of Node.js?*** @@ -347,7 +347,7 @@ Core modules are always preferentially loaded if their identifier is passed to ` Core modules can also be identified using the ```node:``` prefix, in which case it bypasses the require cache. For instance, ```require('node:http')``` will always return the built in HTTP module, even if there is ```require.cache``` entry by that name. ## Q. ***What is callback function in Node.js?*** @@ -366,7 +366,7 @@ myNew(function(err, res){ ``` ## Q. ***How assert works in Node.js?*** @@ -383,7 +383,7 @@ assert(50 > 70, "50 is less than 70."); ``` ## Q. ***What is an error-first callback?*** @@ -404,7 +404,7 @@ Any asynchronous method expects one of the arguments to be a callback. The full In the preceding example, if any exception is thrown during the reading of the file, it lands on the callback function as the first and mandatory parameter. ## Q. ***What is callback hell in Node.js?*** @@ -547,7 +547,7 @@ addRandomNumber(); ``` ## Q. ***What are Promises in Node.js?*** @@ -572,7 +572,7 @@ var myPromise = new Promise(function(resolve, reject){ ``` ## Q. ***What tools can be used to assure consistent style?*** @@ -581,7 +581,7 @@ var myPromise = new Promise(function(resolve, reject){ * Standard ## Q. ***When should you npm and when yarn?*** @@ -616,7 +616,7 @@ npm install yarn --global * Flat Mode: Resolve mismatching versions of dependencies to a single version to avoid creating duplicates. ## Q. ***What is a stub?*** @@ -646,7 +646,7 @@ readFileStub.restore(); ``` ## Q. ***What is a test pyramid? How can you implement it when talking about HTTP APIs?*** @@ -664,7 +664,7 @@ Mike Cohn\'s original test pyramid consists of three layers that your test suite 1. User Interface Tests ## Q. ***How can you secure your HTTP cookies against XSS attacks?*** @@ -696,7 +696,7 @@ Content-Security-Policy: default-src 'self' *.http://sometrustedwebsite.com ``` ## Q. ***How can you make sure your dependencies are safe?*** @@ -712,7 +712,7 @@ The only option is to automate the update / security audit of your dependencies. 7. npm audit fix ## Q. ***What is Event loop in Node.js? How does it work?*** @@ -767,7 +767,7 @@ console.log("Program Ended."); ``` ## Q. ***If Node.js is single threaded then how it handles concurrency?*** @@ -793,7 +793,7 @@ print(5); ## Q. ***What is REPL? What purpose it is used for?*** @@ -817,7 +817,7 @@ $ node ``` ## Q. ***What is asynchronous programming in Node.js?*** @@ -825,7 +825,7 @@ $ node Asynchronous programming is a form of parallel programming that allows a unit of work to run separately from the primary application thread. When the work is complete, it notifies the main thread (as well as whether the work was completed or failed). There are numerous benefits to using it, such as improved application performance and enhanced responsiveness. ## Q. ***What is the difference between Asynchronous and Non-blocking?*** @@ -845,7 +845,7 @@ Nonblocking immediately responses with whatever data available. Moreover, it doe 3) Asynchronous is the opposite of synchronous while nonblocking I/O is the opposite of blocking. They both are fairly similar but they are also different as asynchronous is used with a broader range of operations while nonblocking is mostly used with I/O. ## Q. ***How to debug an application in Node.js?*** @@ -892,7 +892,7 @@ Libraries that enhance stack trace information * Longjohn ## Q. ***What are some of the most popular packages of Node.js?*** @@ -936,7 +936,7 @@ Libraries that enhance stack trace information * **Zmq**: Bindings for node.js and io.js to ZeroMQ .It is a high-performance asynchronous messaging library, aimed at use in distributed or concurrent applications. ## Q. ***What is EventEmitter in Node.js?*** @@ -1005,7 +1005,7 @@ Program Ended. ``` ## Q. ***How many types of streams are present in node.js?*** @@ -1119,7 +1119,7 @@ console.log("File Compressed."); ``` ## Q. ***What is crypto in Node.js? How do you cipher the secure information in Node.js?*** @@ -1162,7 +1162,7 @@ console.log(decrypted); ``` ## Q. ***What is the use of DNS module in Node.js?*** @@ -1212,7 +1212,7 @@ dns.lookupService('127.0.0.1', 22, (err, hostname, service) => { ``` ## Q. ***What are the security mechanisms available in Node.js?*** @@ -1298,7 +1298,7 @@ app.get('/security.txt', securityTxt({ ``` ## Q. ***Name the types of API functions in Node.js?*** @@ -1341,7 +1341,7 @@ fs.readFile('/file.md', (err, data) => { Since `fs.readFile()` is non-blocking, moreWork() does not have to wait for the file read to complete before being called. This allows for higher throughput. ## Q. ***How does Node.js handle child threads?*** @@ -1357,7 +1357,7 @@ Node.js is non-blocking which means that all functions ( callbacks ) are delegat * We can pass messages to forked process ( which is different script ) and to master process from forked process with function send. ## Q. ***What is the preferred method of resolving unhandled exceptions in Node.js?*** @@ -1380,7 +1380,7 @@ Few events are : 1. rejectionHandled ## Q. ***How does Node.js support multi-processor platforms, and does it fully utilize all processor resources?*** @@ -1395,7 +1395,7 @@ Cluster supports two types of load distribution: * The main process assigns the port to a child process and child process itself listen the port. ## Q. ***What is typically the first argument passed to a Node.js callback handler?*** @@ -1413,7 +1413,7 @@ function callback(err, results) { ``` ## Q. ***How Node.js read the content of a file?*** @@ -1461,7 +1461,7 @@ node read_file.js ``` ## Q. ***What is JIT and how is it related to Node.js?*** @@ -1471,7 +1471,7 @@ Node.js has depended on the V8 JavaScript engine to provide code execution in th The `V8` was first designed to increase the performance of the JavaScript execution inside web browsers. In order to obtain speed, V8 translates JavaScript code into more efficient machine code instead of using an interpreter. It compiles JavaScript code into machine code at execution by implementing a JIT (Just-In-Time) compiler like a lot of modern JavaScript engines such as SpiderMonkey or Rhino (Mozilla) are doing. The main difference with V8 is that it doesn’t produce bytecode or any intermediate code. ## Q. ***What is chrome v8 engine?*** @@ -1481,7 +1481,7 @@ V8 is the name of the JavaScript engine that powers Google Chrome. It\'s the thi V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++. It is used in Chrome and in Node.js, among others. It implements ECMAScript and WebAssembly, and runs on Windows 7 or later, macOS 10.12+, and Linux systems that use x64, IA-32, ARM, or MIPS processors. V8 can run standalone, or can be embedded into any C++ application. ## Q. ***What is the purpose of using hidden classes in V8?*** @@ -1489,7 +1489,7 @@ V8 is Google’s open source high-performance JavaScript and WebAssembly engine, *ToDo* ## Q. ***How V8 compiles JavaScript code?*** @@ -1497,7 +1497,7 @@ V8 is Google’s open source high-performance JavaScript and WebAssembly engine, *ToDo* ## Q. ***What is V8 Templates?*** @@ -1505,7 +1505,7 @@ V8 is Google’s open source high-performance JavaScript and WebAssembly engine, *ToDo* ## Q. ***Why is LIBUV needed in Node JS?*** @@ -1513,7 +1513,7 @@ V8 is Google’s open source high-performance JavaScript and WebAssembly engine, LIBUV is a library written in C and it\'s focus is on asynchronous I/O. Node.js use this library to interact with OS, system files and networking and also two core features of Node.js called event loop and thread pool are available in this runtime thanks to this library. ## Q. ***What is difference between put and patch?*** @@ -1536,7 +1536,7 @@ The most commonly used HTTP verbs POST, GET, PUT, DELETE are similar to CRUD (Cr **PATCH**: Submits a partial modification to a resource. If you only need to update one field for the resource, you may want to use the PATCH method. ## Q. ***List types of Http requests supported by Node.js?*** @@ -1693,7 +1693,7 @@ request(options, function(err, res, body) { Using the options object, this request uses the GET method to retrieve JSON data directly from Reddit, which is returned as a string in the body field. From here, you can use `JSON.parse` and use the data as a normal JavaScript object. ## Q. ***Why to use Express.js?*** @@ -1723,7 +1723,7 @@ var server=app.listen(3000,function() {}); ``` ## Q. ***Write the steps for setting up an Express JS application?*** @@ -1784,7 +1784,7 @@ Node Console ``` ## Q. ***Since node is a single threaded process, how to make use of all CPUs?*** @@ -1846,7 +1846,7 @@ The first one (and the default one on all platforms except Windows), is the roun The second approach is where the master process creates the listen socket and sends it to interested workers. The workers then accept incoming connections directly. ## Q. ***What does emitter do and what is dispatcher?*** @@ -1884,7 +1884,7 @@ The Dispatcher has functionality not provided nor expected in EventEmitter, the Pattern-wise, the Dispatcher is also a singleton, whereas EventEmitter is an API that you might object-assign onto multiple stores. ## Q. ***How to kill child processes that spawn their own child processes in Node.js?*** @@ -1914,7 +1914,7 @@ process.kill(-child.pid); Please note - before pid. This converts a pid to a group of pids for process kill() method. ## Q. ***What do you understand by Reactor Pattern in Node.js?*** @@ -1939,7 +1939,7 @@ When all the items in the Event Queue are processed and there are no pending ope 6. When all the items in the Event Queue are processed, the loop will block again on the Event Demultiplexer which will then trigger another cycle. ## Q. ***What are the key features of Node.js?*** @@ -1952,7 +1952,7 @@ When all the items in the Event Queue are processed and there are no pending ope * **No Buffering** – Node.js applications never buffer any data. They simply output the data in chunks. ## Q. ***What are globals in Node.js?*** @@ -2009,7 +2009,7 @@ buffer.write(string) This class also offers other methods like `readInt8` and `writeUInt8` that allows read/write from various types of data to the buffer. ## Q. ***What is chaining process in Node.js?*** @@ -2017,7 +2017,7 @@ This class also offers other methods like `readInt8` and `writeUInt8` that allow It is an approach to connect the output of one stream to the input of another stream, thus creating a chain of multiple stream operations. ## Q. ***What is a control flow function? What are the steps does it execute?*** @@ -2032,7 +2032,7 @@ It executes the following steps. * Call the next step in the program. ## Q. ***What is npm in Node.js?*** @@ -2060,7 +2060,7 @@ npm install express ``` ## Q. ***When to use Node.js and when not to use it?*** @@ -2087,7 +2087,7 @@ Last but not the least, since Node.js uses JavaScript internally, so it fits bes However, we can use Node.js for a variety of applications. But it is a single threaded framework, so we should not use it for cases where the application requires long processing time. If the server is doing some calculation, it won’t be able to process any other requests. Hence, Node.js is best when processing needs less dedicated CPU time. ## Q. ***Explain how does Node.js work?*** @@ -2099,7 +2099,7 @@ Node.js works asynchronously by using the event loop and callback functions, to While processing a request, Node.js attaches a callback function to it and moves it to the back-end. Now, whenever its response is ready, an event is called which triggers the associated callback function to send this response. ## Q. ***Is Node.js entirely based on a single-thread?*** @@ -2111,7 +2111,7 @@ Moreover, Node.js has an optimized design which utilizes both JavaScript and C++ To explain it practically, let’s assume there are 100s of requests lined up in Node.js queue. As per design, the main thread of Node.js event loop will receive all of them and forwards to background workers for execution. Once the workers finish processing requests, the registered callbacks get notified on event loop thread to pass the result back to the user. ## Q. ***How to make post request in Node.js?*** @@ -2129,7 +2129,7 @@ var request = require('request'); ``` ## Q. ***Can you create http server in Node.js, explain the code used for it?*** @@ -2149,7 +2149,7 @@ server.listen(4200); // The port where you want to start with. ``` ## Q. ***How to load html in Node.js?*** @@ -2189,7 +2189,7 @@ response.end(); ``` ## Q. ***How can you listen on port 80 with Node?*** @@ -2201,7 +2201,7 @@ iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000 ``` ## Q. ***What is the difference between operational and programmer errors?*** @@ -2209,7 +2209,7 @@ iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000 Operation errors are not bugs, but problems with the system, like request timeout or hardware failure. On the other hand programmer errors are actual bugs. ## Q. ***Why npm shrinkwrap is useful?*** @@ -2223,7 +2223,7 @@ npm shrinkwrap It should create new npm-shrinkwrap.json file with information about all packages you use. ## Q. ***What is your favourite HTTP framework and why?*** @@ -2273,7 +2273,7 @@ Template engines allow developer to embed backend variables into HTML files, and As a minimal framework, Express does not consider database integration as a required aspect within its package, thus it leans toward no specific database usage whatsoever. While adopting a particular data storage technology, be it MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch or something else, it’s just a matter of installing the particular npm package as database driver. These third party database drivers do not conform to unified syntax when doing CRUD instructions, which makes switching databases a big hassle and error prone. ## Q. ***What are the Challenges with Node.js?*** @@ -2320,7 +2320,7 @@ It is required for those web applications where traffic rate is very high. Node. The runtime environment of Node.js interprets JavaScript, which is very easy and simple to understand and code. Due to this reason, even the developers find it easy going which keeps them happy and relaxed. It is pertinent for real-time collaborative apps. ## Q. ***How Node.js overcomes the problem of blocking of I/O operations?*** @@ -2330,7 +2330,7 @@ Node.js solves this problem by putting the event based model at its core, using Node.js uses an event loop for this. An event loop is “an entity that handles and processes external events and converts them into callback invocations”. Whenever data is needed nodejs registers a callback and sends the operation to this event loop. Whenever the data is available the callback is called. ## Q. ***What are async functions in Node?*** @@ -2338,7 +2338,7 @@ Node.js uses an event loop for this. An event loop is “an entity that handles *ToDo* ## Q. ***Mention the steps by which you can async in Node.js?*** @@ -2394,7 +2394,7 @@ addAsync(10).then((sum) => { ``` ## Q. ***What are the timing features of Node.js?*** @@ -2402,7 +2402,7 @@ addAsync(10).then((sum) => { *ToDo* ## Q. ***What is LTS releases of Node.js why should you care?*** @@ -2412,7 +2412,7 @@ An LTS(Long Term Support) version of Node.js receives all the critical bug fixes LTS versions of Node.js are supported for at least 18 months and are indicated by even version numbers (e.g. 4, 6, 8). They’re best for production since the LTS release line is focussed on stability and security, whereas the Current release line has a shorter lifespan and more frequent updates to the code. Changes to LTS versions are limited to bug fixes for stability, security updates, possible npm updates, documentation updates and certain performance improvements that can be demonstrated to not break existing applications. ## Q. ***Why should you separate Express 'app' and 'server'?*** @@ -2449,7 +2449,7 @@ var server = http.createServer(app); ``` ## Q. ***What is the difference between process.nextTick() and setImmediate()?*** @@ -2457,7 +2457,7 @@ var server = http.createServer(app); The difference between `process.nextTick()` and `setImmediate()` is that `process.nextTick()` defers the execution of an action till the next pass around the event loop or it simply calls the callback function once the ongoing execution of the event loop is finished whereas `setImmediate()` executes a callback on the next cycle of the event loop and it gives back to the event loop for executing any I/O operations. ## Q. ***What is difference between JavaScript and Node.js?*** @@ -2469,7 +2469,7 @@ The difference between `process.nextTick()` and `setImmediate()` is that `proces |Running Engine| JavaScript running any engine like Spider monkey (FireFox), JavaScript Core (Safari), V8 (Google Chrome).| Node JS only run in a V8 engine which mainly used by google chrome. And javascript program which will be written under this Node JS will be always run in V8 Engine.| ## Q. ***What are the difference between Events and Callbacks?*** @@ -2513,7 +2513,7 @@ eventEmitter.emit('Sum', '10', '20'); ``` ## Q. ***Explain RESTful Web Services in Node.js?*** @@ -2648,7 +2648,7 @@ var server = app.listen(3000, function () { ``` ## Q. ***What is the difference between req.params and req.query?*** @@ -2661,7 +2661,7 @@ A query string is a part of a URL that assigns values to specified parameters. A ## Q. ***How to handle file upload in Node.js?*** @@ -2759,7 +2759,7 @@ app.listen(3000, function(){ ``` ## Q. ***Explain the terms body-parser, cookie-parser, morgan, nodemon, pm2, serve-favicon, cors, dotenv, fs-extra, moment in Express JS?*** @@ -3069,7 +3069,7 @@ moment().subtract(3, 'days').calendar(); // Last Wednesday at 3:18 PM ``` ## Q. ***How does routing work in Node.js?*** @@ -3190,7 +3190,7 @@ module.exports = router ``` ## Q. ***How node.js prevents blocking code?*** @@ -3220,7 +3220,7 @@ moreWork(); // will run before console.log ``` ## Q. ***What is difference between promises and async-await in Node.js?*** @@ -3270,7 +3270,7 @@ async function logFetch(url) { ``` ## Q. ***How to use JSON Web Token (JWT) for authentication in Node.js?*** @@ -3350,7 +3350,7 @@ The `jwt.sign()` method takes a payload and the secret key defined in `config.js * **[https://www.npmjs.com/package/jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken)** ## Q. **_How to implement asymmetric cryptography when signing and verify JSON Web Token (JWT) for authentication in node js?_** @@ -3471,7 +3471,7 @@ The `jwt.sign()` method takes a payload, private key defined in `./certs/accessT - **[https://www.npmjs.com/package/jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken)** ## Q. ***How to build a microservices architecture with Node.js?*** @@ -3556,7 +3556,7 @@ module.exports = controllers; ``` ## Q. ***How to use Q promise in Node.js?*** @@ -3611,7 +3611,7 @@ Q.fcall(promisedStep1) * **[https://www.npmjs.com/package/q](https://www.npmjs.com/package/q)** ## Q. ***How to implement Memcached in Node.js?*** @@ -3652,7 +3652,7 @@ var memcached = new Memcached('localhost:11211', {retries:10,retry:10000,remove: * **[https://www.npmjs.com/package/memcached](https://www.npmjs.com/package/memcached)** ## Q. ***How to generate and verify checksum of the given string in Nodejs*** @@ -3682,7 +3682,7 @@ console.log(hashPwd); //ef5225a03e4f9cc953ab3c4dd41f5c4db7dc2e5b ``` ## Q. ***How to Validate Data using joi Module in Node.js?*** @@ -3731,7 +3731,7 @@ if (response.error) { **⚝ [Try this example on CodeSandbox](https://codesandbox.io/s/schema-validation-using-joi-s2nhzs)** ## Q. ***What are the middleware functions in Node.js?*** @@ -3756,7 +3756,7 @@ The following figure shows the elements of a middleware function call: Middleware functions that return a Promise will call `next(value)` when they reject or throw an error. `next` will be called with either the rejected value or the thrown Error. ## Q. ***Explain the use of next in node.js with example?*** @@ -3790,7 +3790,7 @@ app.listen(3000); *Note: The `next()` function is not a part of the Node.js or Express API, but is the third argument that is passed to the middleware function. The `next()` function could be named anything, but by convention it is always named “next”. To avoid confusion, always use this convention.* #### Q. ***Is it possible to use "Class" in Node.js?*** @@ -3813,5 +3813,5 @@ app.listen(3000); #### Q. ***Why do we need C++ Addons in Node.js?*** From fa60ae5f025b0aa1b5aa66e2f65044d54c6a79c7 Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sat, 20 Aug 2022 12:48:52 +0530 Subject: [PATCH 018/225] Initial commit --- global-objects.js | 37 ---------------- exec.js => nodejs-basics/exec.js | 0 fs-module.js => nodejs-basics/fs-module.js | 0 nodejs-basics/global-objects.js | 42 ++++++++++++++----- .../miscellaneous.js | 0 play-video.js => nodejs-basics/play-video.js | 0 .../standard-input-output.js | 0 package-lock.json | 3 -- 8 files changed, 32 insertions(+), 50 deletions(-) delete mode 100644 global-objects.js rename exec.js => nodejs-basics/exec.js (100%) rename fs-module.js => nodejs-basics/fs-module.js (100%) rename miscellaneous.js => nodejs-basics/miscellaneous.js (100%) rename play-video.js => nodejs-basics/play-video.js (100%) rename standard-input-output.js => nodejs-basics/standard-input-output.js (100%) delete mode 100644 package-lock.json diff --git a/global-objects.js b/global-objects.js deleted file mode 100644 index 43744a6..0000000 --- a/global-objects.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * ------------------ - * Global Objects - * ------------------ - * - * __dirname() - * __filename() - * clearTimeout(timeoutObject) - * console() - * exports() - * global() - * module() - * Process() - * require() - * setTimeout(callback, delay[, ...args]) - * TextDecoder() - * TextEncoder() - * URL() - * - * */ - -//---------------------- -// reqiure() Object -//---------------------- - var path = require("path"); - console.log(`Rock on world from ${path.basename(__filename)}`); // Rock on world from global-objects.js - - const jsonData = require('./assets/file.json'); - console.log(jsonData); - - -//------------------------- -// dirname() & filename() -//------------------------- -console.log(`Current directory: ${__dirname}`); -console.log(`Current directory: ${path.dirname(__filename)}`); -console.log(`Current file: ${__filename}`); diff --git a/exec.js b/nodejs-basics/exec.js similarity index 100% rename from exec.js rename to nodejs-basics/exec.js diff --git a/fs-module.js b/nodejs-basics/fs-module.js similarity index 100% rename from fs-module.js rename to nodejs-basics/fs-module.js diff --git a/nodejs-basics/global-objects.js b/nodejs-basics/global-objects.js index f601694..43744a6 100644 --- a/nodejs-basics/global-objects.js +++ b/nodejs-basics/global-objects.js @@ -1,15 +1,37 @@ /** - * Global Objects + * ------------------ + * Global Objects + * ------------------ * - */ + * __dirname() + * __filename() + * clearTimeout(timeoutObject) + * console() + * exports() + * global() + * module() + * Process() + * require() + * setTimeout(callback, delay[, ...args]) + * TextDecoder() + * TextEncoder() + * URL() + * + * */ + +//---------------------- +// reqiure() Object +//---------------------- + var path = require("path"); + console.log(`Rock on world from ${path.basename(__filename)}`); // Rock on world from global-objects.js -// Displays current directory -console.log(__dirname); + const jsonData = require('./assets/file.json'); + console.log(jsonData); -// Displays filename with path -console.log(__filename); - -// Displays filename -var path = require("path"); -console.log(path.basename(__filename)); +//------------------------- +// dirname() & filename() +//------------------------- +console.log(`Current directory: ${__dirname}`); +console.log(`Current directory: ${path.dirname(__filename)}`); +console.log(`Current file: ${__filename}`); diff --git a/miscellaneous.js b/nodejs-basics/miscellaneous.js similarity index 100% rename from miscellaneous.js rename to nodejs-basics/miscellaneous.js diff --git a/play-video.js b/nodejs-basics/play-video.js similarity index 100% rename from play-video.js rename to nodejs-basics/play-video.js diff --git a/standard-input-output.js b/nodejs-basics/standard-input-output.js similarity index 100% rename from standard-input-output.js rename to nodejs-basics/standard-input-output.js diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 48e341a..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "lockfileVersion": 1 -} From dca83ac85f64b630e23b5aef62bf319b6de46c88 Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sat, 20 Aug 2022 12:50:52 +0530 Subject: [PATCH 019/225] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cbb5128..19d8860 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ Just like JS, there are two categories of data types in Node: Primitives and Obj ↥ back to top
-## # 2. NODEJS SETUP +## # 2. NODE.JS SETUP
@@ -190,7 +190,7 @@ console.log(qdata.month); //returns 'september' ↥ back to top -## # 3. NODEJS EVENTS +## # 3. NODE.JS EVENTS ## Q. ***How to make an HTTP POST request using Node.js?*** From 87e905f5a01a7f1909098f70f8fb2ba5903054ea Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Date: Sat, 20 Aug 2022 20:25:32 +0530 Subject: [PATCH 020/225] Update README.md --- README.md | 4594 ++++++++++++++++++++++++++--------------------------- 1 file changed, 2225 insertions(+), 2369 deletions(-) diff --git a/README.md b/README.md index 19d8860..a081fa0 100644 --- a/README.md +++ b/README.md @@ -17,16 +17,18 @@ * [Introduction](#-1-introduction) * [Node.js Setup](#-2-nodejs-setup) -* [Node.js Events](#-3-nodejs-events) -* [Node.js File System](#-4-nodejs-file-system) -* [Node.js Streams](#-5-nodejs-streams) -* [Node.js Web Module](#-6-nodejs-web-module) -* [Node.js Middleware](#-7-nodejs-middleware) -* [Node.js RESTFul API](#-8-nodejs-restful-api) -* [Node.js Routing](#-9-nodejs-routing) -* [Node.js Error Handling](#-10-nodejs-error-handling) -* [Node.js Logging](#-11-nodejs-logging) -* [Node.js Testing](#-12-nodejs-testing) +* [Node.js Architecture](#-3-nodejs-architecture) +* [Node.js Events](#-4-nodejs-events) +* [Node.js File System](#-5-nodejs-file-system) +* [Node.js Streams](#-6-nodejs-streams) +* [Node.js Web Module](#-7-nodejs-web-module) +* [Node.js Middleware](#-8-nodejs-middleware) +* [Node.js RESTFul API](#-9-nodejs-restful-api) +* [Node.js Routing](#-10-nodejs-routing) +* [Node.js Error Handling](#-11-nodejs-error-handling) +* [Node.js Logging](#-12-nodejs-logging) +* [Node.js Testing](#-13-nodejs-testing) +* [Node.js Miscellaneous](#-14-nodejs-miscellaneous)
@@ -38,29 +40,6 @@ Node.js is an open-source server side runtime environment built on Chrome\'s V8 JavaScript engine. It provides an event driven, non-blocking (asynchronous) I/O and cross-platform runtime environment for building highly scalable server-side applications using JavaScript. - - -## Q. ***What are the benefits of using Node.js?*** - -From a web server development perspective Node has a number of benefits: - - * Great performance! Node was designed to optimize throughput and scalability in web applications and is a good solution for many common web-development problems (e.g. real-time web applications). - - * Code is written in "plain old JavaScript", which means that less time is spent dealing with "context shift" between languages when you're writing both client-side and server-side code. - - * JavaScript is a relatively new programming language and benefits from improvements in language design when compared to other traditional web-server languages (e.g. Python, PHP, etc.) Many other new and popular languages compile/convert into JavaScript so you can use TypeScript, CoffeeScript, ClojureScript, Scala, LiveScript, etc. - - * The node package manager (NPM) provides access to hundres of thousands of resuable packages. It also has best-in-class dependency resolution and can also be used to automate most of the build toolchain. - - * Node.js is portable. It is available on Microsoft Windows, macOS, Linux, Solaris, FreeBSD, OpenBSD, WebOS, and NonStop OS. Furthermore, it is well-supported by many web hosting providers, that often provide specific infrastrucutre and documentation for hosting - Node sites. - - * It has a very active third party ecosystem and developer community, with lots of people who are willing to help. - - - @@ -102,6 +81,43 @@ Just like JS, there are two categories of data types in Node: Primitives and Obj ↥ back to top +## Q. ***What are the key features of Node.js?*** + +* **Asynchronous event driven IO helps concurrent request handling** – All APIs of Node.js are asynchronous. This feature means that if a Node receives a request for some Input/Output operation, it will execute that operation in the background and continue with the processing of other requests. Thus it will not wait for the response from the previous requests. +* **Fast in Code execution** – Node.js uses the V8 JavaScript Runtime engine, the one which is used by Google Chrome. Node has a wrapper over the JavaScript engine which makes the runtime engine much faster and hence processing of requests within Node.js also become faster. +* **Single Threaded but Highly Scalable** – Node.js uses a single thread model for event looping. The response from these events may or may not reach the server immediately. However, this does not block other operations. Thus making Node.js highly scalable. Traditional servers create limited threads to handle requests while Node.js creates a single thread that provides service to much larger numbers of such requests. +* **Node.js library uses JavaScript** – This is another important aspect of Node.js from the developer’s point of view. The majority of developers are already well-versed in JavaScript. Hence, development in Node.js becomes easier for a developer who knows JavaScript. +* **There is an Active and vibrant community for the Node.js framework** – The active community always keeps the framework updated with the latest trends in the web development. +* **No Buffering** – Node.js applications never buffer any data. They simply output the data in chunks. + + + +## Q. ***Explain how does Node.js work?*** + +A Node.js application creates a single thread on its invocation. Whenever Node.js receives a request, it first completes its processing before moving on to the next request. + +Node.js works asynchronously by using the event loop and callback functions, to handle multiple requests coming in parallel. An Event Loop is a functionality which handles and processes all your external events and just converts them to a callback function. It invokes all the event handlers at a proper time. Thus, lots of work is done on the back-end, while processing a single request, so that the new incoming request doesn’t have to wait if the processing is not complete. + +While processing a request, Node.js attaches a callback function to it and moves it to the back-end. Now, whenever its response is ready, an event is called which triggers the associated callback function to send this response. + + + +## Q. ***Is Node.js entirely based on a single-thread?*** + +Yes, it is true that Node.js processes all requests on a single thread. But it is just a part of the theory behind Node.js design. In fact, more than the single thread mechanism, it makes use of events and callbacks to handle a large no. of requests asynchronously. + +Moreover, Node.js has an optimized design which utilizes both JavaScript and C++ to guarantee maximum performance. JavaScript executes at the server-side by Google Chrome v8 engine. And the C++ lib UV library takes care of the non-sequential I/O via background workers. + +To explain it practically, let’s assume there are 100s of requests lined up in Node.js queue. As per design, the main thread of Node.js event loop will receive all of them and forwards to background workers for execution. Once the workers finish processing requests, the registered callbacks get notified on event loop thread to pass the result back to the user. + + + ## # 2. NODE.JS SETUP
@@ -168,12 +184,12 @@ node app.js The URL module in Node.js splits up a web address into readable parts. Use ```require()``` to include the module: -```javascript +```js var url = require('url'); ``` Then parse an address with the ```url.parse()``` method, and it will return a URL object with each part of the address as properties. -```javascript +```js var url = require('url'); var adr = 'http://localhost:8080/default.htm?year=2021&month=september'; var q = url.parse(adr, true); @@ -190,107 +206,11 @@ console.log(qdata.month); //returns 'september' ↥ back to top -## # 3. NODE.JS EVENTS - -## Q. ***How to make an HTTP POST request using Node.js?*** - -```js -const https = require('https') - - -const obj = { - "userId":1, - "id":1, - "title":"whatever", - "completed":false -} - -const data = JSON.stringify(obj) - -const options = { - hostname: 'jsonplaceholder.typicode.com', - port: 443, - path: '/todos', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Content-Length': data.length - } -} - -const req = https.request(options, res => { - console.log(`statusCode: ${res.statusCode}`) - - res.on('data', d => { - process.stdout.write(d) - }) -}) - -req.on('error', error => { - console.error(error) -}) - -req.write(data) -req.end() -``` - - - -## Q. ***How to execute an external program from within Node.js?*** - -```js -const { exec } = require('child_process'); - -exec('"/path/to/test file/test.sh" arg1 arg2'); - -exec('echo "The \\$HOME variable is $HOME"'); -``` - - - -## Q. ***What does the runtime environment mean in Node.js?*** - -The Node.js runtime is the software stack responsible for installing your web service\'s code and its dependencies and running your service. - -The Node.js runtime for App Engine in the standard environment is declared in the `app.yaml` file: - -```js -runtime: nodejs10 -``` - -The runtime environment is literally just the environment your application is running in. This can be used to describe both the hardware and the software that is running your application. How much RAM, what version of node, what operating system, how much CPU cores, can all be referenced when talking about a runtime environment. - - - - -## Q. ***Explain usage of NODE_ENV?*** - -NODE_ENV is an environment variable made popular by the express web server framework. When a node application is run, it can check the value of the environment variable and do different things based on the value. - -For example, when we work on a project and there are production and development environments. We don't need to use caching in the development env. So we set - ```bash - $ NODE_ENV=development - ``` - -and use the code below -```js -if (process.env.NODE_ENV === 'development') - useCaching = false; -``` -Upon that, if the project runs on production it will use caching. - +## # 3. NODE.JS ARCHITECTURE - +
-## Q. ***How do Node.js works?*** +## Q. ***How does Node.js works?***

Node Architecture @@ -325,18 +245,6 @@ Node JS Platform does not follow Request/Response Multi-Threaded Stateless Model ↥ back to top -## Q. ***What is the difference between Node.js, AJAX, and JQuery?*** - -Node.js is a javascript runtime that makes it possible for us to write back-end of applications. - -Asynchronous JavaScript and XML(AJAX) refers to group of technologies that we use to send requests to web servers and retrieve data from them without reloading the page. - -Jquery is a simple javascript library that helps us with front-end development. - -

- ## Q. ***What are the core modules of Node.js?*** @@ -350,725 +258,454 @@ Core modules can also be identified using the ```node:``` prefix, in which case ↥ back to top -## Q. ***What is callback function in Node.js?*** - -In node.js, we basically use callbacks for handling asynchronous operations like — making any I/O request, database operations or calling an API to fetch some data. Callback allows our code to not get blocked when a process is taking a long time. - -```javascript -function myNew(next){ - console.log("Im the one who initates callback"); - next("nope", "success"); -} - -myNew(function(err, res){ - console.log("I got back from callback",err, res); -}); -``` +## Q. ***What do you understand by Reactor Pattern in Node.js?*** - +Reactor Pattern is an idea of non-blocking I/O operations in Node.js. This pattern provides a handler(in case of Node.js, a callback function) that is associated with each I/O operation. When an I/O request is generated, it is submitted to a demultiplexer. -## Q. ***How assert works in Node.js?*** +This demultiplexer is a notification interface that is used to handle concurrency in non-blocking I/O mode and collects every request in form of an event and queues each event in a queue. Thus, the demultiplexer provides the Event Queue, which we often hear about. When a request is collected by the demultiplexer, it returns the control back to the system and does not blocks the I/O. At the same time, there is an Event Loop which iterates over the items in the Event Queue. Every event has a callback function associated with it, and that callback function is invoked when the Event Loop iterates. -The assert module provides a way of testing expressions. If the expression evaluates to 0, or false, an assertion failure is being caused, and the program is terminated. +The callback function further mostly have other callbacks associated within representing some asynchronous operations. These operations are inserted in the Event Queue by the demultiplexer and are ready to be processed once the Event Loop iterates over them. That is why calls to other operations must be asynchronous. -This module was built to be used internally by Node.js. +When all the items in the Event Queue are processed and there are no pending operations left, Node.js terminates the application automatically. -``` -// Sample usage +

+ Test Pyramid +

-const assert = require('assert'); -assert(50 > 70, "50 is less than 70."); -``` +1. The application generates a new I/O operation by submitting a request to the Event Demultiplexer. The application also specifies a handler, which will be invoked when the operation completes. Submitting a new request to the Event Demultiplexer is a non-blocking call and it immediately returns the control back to the application. +2. When a set of I/O operations completes, the Event Demultiplexer pushes the new events into the Event Queue. +3. At this point, the Event Loop iterates over the items of the Event Queue. +4. For each event, the associated handler is invoked. +5. The handler, which is part of the application code, will give back the control to the Event Loop when its execution completes (5a). However, new asynchronous operations might be requested during the execution of the handler (5b), causing new operations to be inserted in the Event Demultiplexer (1), before the control is given back to the Event Loop. +6. When all the items in the Event Queue are processed, the loop will block again on the Event Demultiplexer which will then trigger another cycle. -## Q. ***What is an error-first callback?*** +## Q. ***What are globals in Node.js?*** -The pattern used across all the asynchronous methods in Node.js is called *Error-first Callback*. Here is an example: +There are three keywords in Node.js which constitute as Globals. These are Global, Process, and Buffer. -```javascript -fs.readFile( "file.json", function ( err, data ) { - if ( err ) { - console.error( err ); - } - console.log( data ); -}); -``` +**1. Global:** -Any asynchronous method expects one of the arguments to be a callback. The full callback argument list depends on the caller method, but the first argument is always an error object or null. When we go for the asynchronous method, an exception thrown during function execution cannot be detected in a try/catch statement. The event happens after the JavaScript engine leaves the try block. +The Global keyword represents the global namespace object. It acts as a container for all other `global` objects. If we type `console.log(global)`, it will print out all of them. -In the preceding example, if any exception is thrown during the reading of the file, it lands on the callback function as the first and mandatory parameter. +An important point to note about the global objects is that not all of them are in the global scope, some of them fall in the module scope. So, it is wise to declare them without using the var keyword or add them to Global object. - +Variables declared using the var keyword become local to the module whereas those declared without it get subscribed to the global object. -## Q. ***What is callback hell in Node.js?*** +**2. Process:** -`Callback hell` is a phenomenon that afflicts a JavaScript developer when he tries to execute multiple asynchronous operations one after the other. +It is also one of the global objects but includes additional functionality to turn a synchronous function into an async callback. There is no boundation to access it from anywhere in the code. It is the instance of the EventEmitter class. And each node application object is an instance of the Process object. -An asynchronous function is one where some external activity must complete before a result can be processed; it is “asynchronous” in the sense that there is an unpredictable amount of time before a result becomes available. Such functions require a callback function to handle errors and process the result. +It primarily gives back the information about the application or the environment. -```javascript -getData(function(a){ - getMoreData(a, function(b){ - getMoreData(b, function(c){ - getMoreData(c, function(d){ - getMoreData(d, function(e){ - ... - }); - }); - }); - }); -}); -``` +* `` – to get the execution path of the Node app. +* `` – to get the Node version currently running. +* `` – to get the server platform. -**Techniques for avoiding callback hell** +Some of the other useful Process methods are as follows. -1. Using Async.js -1. Using Promises -1. Using Async-Await +* `` – To know the memory used by Node application. +* `` – To attach a callback function that will get called during the next loop. It can cause a delay in executing a function. -* **Managing callbacks using Async.js** +**3. Buffer:** -`Async` is a really powerful npm module for managing asynchronous nature of JavaScript. Along with Node.js, it also works for JavaScript written for browsers. +The Buffer is a class in Node.js to handle binary data. It is similar to a list of integers but stores as a raw memory outside the V8 heap. -Async provides lots of powerful utilities to work with asynchronous processes under different scenarios. +We can convert JavaScript string objects into Buffers. But it requires mentioning the encoding type explicitly. -```bash -npm install --save async -``` +* `` – Specifies 7-bit ASCII data. +* `` – Represents multibyte encoded Unicode char set. +* `` – Indicates 2 or 4 bytes, little endian encoded Unicode chars. +* `` – Used for Base64 string encoding. +* `` – Encodes each byte as two hexadecimal chars. -* **ASYNC WATERFALL** +Here is the syntax to use the Buffer class. -```javascript -var async = require('async'); -async.waterfall([ - function(callback) { - //doSomething - callback(null, paramx); //paramx will be availaible as the first parameter to the next function - /** - The 1st parameter passed in callback. - @null or @undefined or @false control moves to the next function - in the array - if @true or @string the control is immediately moved - to the final callback function - rest of the functions in the array - would not be executed - */ - }, - function(arg1, callback) { - //doSomething else - // arg1 now equals paramx - callback(null, result); - }, - function(arg1, callback) { - //do More - // arg1 now equals result - callback(null, 'done'); - }, - function(arg1, callback) { - //even more - // arg1 now equals 'done' - callback(null, 'done'); - } -], function (err, result) { - //final callback function - //finally do something when all function are done. - // result now equals 'done' -}); -``` - -* **ASYNC SERIES** - -```javascript -var async = require('async'); -async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - /** - The 1st parameter passed in callback. - @null or @undefined or @false control moves to the next function - in the array - if @true or @string the control is immedeatly moved - to the final callback function with the value of err same as - passed over here and - rest of the functions in the array - would not be executed - */ - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - } -], -// optional callback -function(err, results){ - // results is now equal to ['one', 'two'] -}); +```js +var buffer = new Buffer(string, [encoding]); ``` -* **Managing callbacks hell using promises** - -Promises are alternative to callbacks while dealing with asynchronous code. Promises return the value of the result or an error exception. The core of the promises is the `.then()` function, which waits for the promise object to be returned. The `.then()` function takes two optional functions as arguments and depending on the state of the promise only one will ever be called. The first function is called when the promise if fulfilled (A successful result). The second function is called when the promise is rejected. +The above command will allocate a new buffer holding the string with `utf8` as the default encoding. However, if you like to write a `string` to an existing buffer object, then use the following line of code. -```javascript -var outputPromise = getInputPromise().then(function (input) { - //handle success -}, function (error) { - //handle error -}); +```js +buffer.write(string) ``` -* **Using Async Await** - -Async await makes asynchronous code look like it\’s synchronous. This has only been possible because of the reintroduction of promises into node.js. Async-Await only works with functions that return a promise. - -```javascript -const getrandomnumber = function(){ - return new Promise((resolve, reject)=>{ - setTimeout(() => { - resolve(Math.floor(Math.random() * 20)); - }, 1000); - }); -} - -const addRandomNumber = async function(){ - const sum = await getrandomnumber() + await getrandomnumber(); - console.log(sum); -} - -addRandomNumber(); -``` +This class also offers other methods like `readInt8` and `writeUInt8` that allows read/write from various types of data to the buffer. -## Q. ***What are Promises in Node.js?*** +## # 4. NODE.JS EVENTS -It allows to associate handlers to an asynchronous action\'s eventual success value or failure reason. This lets asynchronous methods return values like synchronous methods: instead of the final value, the asynchronous method returns a promise for the value at some point in the future. +
-Promises in node.js promised to do some work and then had separate callbacks that would be executed for success and failure as well as handling timeouts. Another way to think of promises in node.js was that they were emitters that could emit only two events: success and error.The cool thing about promises is you can combine them into dependency chains (do Promise C only when Promise A and Promise B complete). +## Q. ***What is EventEmitter in Node.js?*** -The core idea behind promises is that a promise represents the result of an asynchronous operation. A promise is in one of three different states: +All objects that emit events are members of EventEmitter class. These objects expose an `eventEmitter.on()` function that allows one or more functions to be attached to named events emitted by the object. -* pending - The initial state of a promise. -* fulfilled - The state of a promise representing a successful operation. -* rejected - The state of a promise representing a failed operation. -Once a promise is fulfilled or rejected, it is immutable (i.e. it can never change again). +When the EventEmitter object emits an event, all of the functions attached to that specific event are called synchronously. All values returned by the called listeners are ignored and will be discarded. -**Creating a Promise** +*Example*: -```javascript -var myPromise = new Promise(function(resolve, reject){ - .... -}) -``` +```js +const events = require('events'); +const eventEmitter = new events.EventEmitter(); - +// listener #1 +const listener1 = function listener1() { + console.log('listener1 executed.'); +} + +// listener #2 +const listener2 = function listener2() { + console.log('listener2 executed.'); +} -## Q. ***What tools can be used to assure consistent style?*** +// Bind the connection event with the listener1 function +eventEmitter.addListener('connection', listener1); -* ESLint -* Standard +// Bind the connection event with the listener2 function +eventEmitter.on('connection', listener2); - +let eventListeners = eventEmitter.listenerCount('connection') +console.log(eventListeners + " Listener(s) listening to connection event"); -## Q. ***When should you npm and when yarn?*** +// Fire the connection event +eventEmitter.emit('connection'); -* **npm** +// Remove the binding of listener1 function +eventEmitter.removeListener('connection', listener1); +console.log("Listener1 will not listen now."); -It is the default method for managing packages in the Node.js runtime environment. It relies upon a command line client and a database made up of public and premium packages known as the the npm registry. Users can access the registry via the client and browse the many packages available through the npm website. Both npm and its registry are managed by npm, Inc. +// Fire the connection event +eventEmitter.emit('connection'); -```bash -node -v -npm -v -``` +eventListeners = eventEmitter.listenerCount('connection') +console.log(eventListeners + " Listener(s) listening to connection event"); -* **Yarn** +console.log("Program Ended."); +``` -Yarn was developed by Facebook in attempt to resolve some of npm’s shortcomings. Yarn isn’t technically a replacement for npm since it relies on modules from the npm registry. Think of Yarn as a new installer that still relies upon the same npm structure. The registry itself hasn’t changed, but the installation method is different. Since Yarn gives you access to the same packages as npm, moving from npm to Yarn doesn’t require you to make any changes to your workflow. +Now run the main.js ```bash -npm install yarn --global +$ node main.js ``` -**Comparing Yarn vs npm** +Output -* Fast: Yarn caches every package it downloads so it never needs to again. It also parallelizes operations to maximize resource utilization so install times are faster than ever. -* Reliable: Using a detailed, but concise, lockfile format, and a deterministic algorithm for installs, Yarn is able to guarantee that an install that worked on one system will work exactly the same way on any other system. -* Secure: Yarn uses checksums to verify the integrity of every installed package before its code is executed. -* Offline Mode: If you've installed a package before, you can install it again without any internet connection. -* Deterministic: The same dependencies will be installed the same exact way across every machine regardless of install order. -* Network Performance: Yarn efficiently queues up requests and avoids request waterfalls in order to maximize network utilization. -* Multiple Registries: Install any package from either npm or Bower and keep your package workflow the same. -* Network Resilience: A single request failing won't cause an install to fail. Requests are retried upon failure. -* Flat Mode: Resolve mismatching versions of dependencies to a single version to avoid creating duplicates. +```bash +2 Listener(s) listening to connection event +listener1 executed. +listener2 executed. +Listener1 will not listen now. +listener2 executed. +1 Listener(s) listening to connection event +Program Ended. +``` -## Q. ***What is a stub?*** +## Q. ***What is Event loop in Node.js?*** -Stubbing and verification for node.js tests. Enables you to validate and override behaviour of nested pieces of code such as methods, require() and npm modules or even instances of classes. This library is inspired on node-gently, MockJS and mock-require. +The event loop is what allows Node.js to perform non-blocking I/O operations — despite the fact that JavaScript is single-threaded — by offloading operations to the system kernel whenever possible. -**Features of Stub:** +Node.js is a single-threaded application, but it can support concurrency via the concept of `event` and `callbacks`. Every API of Node.js is asynchronous and being single-threaded, they use `async function calls` to maintain concurrency. Node uses observer pattern. Node thread keeps an event loop and whenever a task gets completed, it fires the corresponding event which signals the event-listener function to execute. -* Produces simple, lightweight Objects capable of extending down their tree -* Compatible with Nodejs -* Easily extendable directly or through an ExtensionManager -* Comes with predefined, usable extensions +**Event-Driven Programming:** -Stubs are functions/programs that simulate the behaviours of components/modules. Stubs provide canned answers to function calls made during test cases. Also, you can assert on with what these stubs were called. +In an event-driven application, there is generally a main loop that listens for events, and then triggers a callback function when one of those events is detected. -A use-case can be a file read, when you do not want to read an actual file: +Although events look quite similar to callbacks, the difference lies in the fact that callback functions are called when an asynchronous function returns its result, whereas event handling works on the observer pattern. The functions that listen to events act as Observers. Whenever an event gets fired, its listener function starts executing. Node.js has multiple in-built events available through events module and EventEmitter class which are used to bind events and event-listeners as follows -```javascript -var fs = require('fs'); +```js +// Import events module +var events = require('events'); -var readFileStub = sinon.stub(fs, 'readFile', function (path, cb) { - return cb(null, 'filecontent'); +// Create an eventEmitter object +var eventEmitter = new events.EventEmitter(); +``` + +*Example*: + +```js +// Import events module +var events = require('events'); + +// Create an eventEmitter object +var eventEmitter = new events.EventEmitter(); + +// Create an event handler as follows +var connectHandler = function connected() { + console.log('connection succesful.'); + + // Fire the data_received event + eventEmitter.emit('data_received'); +} + +// Bind the connection event with the handler +eventEmitter.on('connection', connectHandler); + +// Bind the data_received event with the anonymous function +eventEmitter.on('data_received', function() { + console.log('data received succesfully.'); }); -expect(readFileStub).to.be.called; -readFileStub.restore(); +// Fire the connection event +eventEmitter.emit('connection'); + +console.log("Program Ended."); ``` -## Q. ***What is a test pyramid? How can you implement it when talking about HTTP APIs?*** +## Q. ***If Node.js is single threaded then how it handles concurrency?*** -The "Test Pyramid" is a metaphor that tells us to group software tests into buckets of different granularity. It also gives an idea of how many tests we should have in each of these groups. It shows which kinds of tests you should be looking for in the different levels of the pyramid and gives practical examples on how these can be implemented. +Node js despite being single-threaded is the asynchronous nature that makes it possible to handle concurrency and perform multiple I/O operations at the same time. Node js uses an event loop to maintain concurrency and perform non-blocking I/O operations. -

- Test Pyramid -

+As soon as Node js starts, it initializes an event loop. The event loop works on a queue (which is called an event queue) and performs tasks in FIFO (First In First Out) order. It executes a task only when there is no ongoing task in the call stack. The call stack works in LIFO(Last In First Out) order. The event loop continuously checks the call stack to check if there is any task that needs to be run. Now whenever the event loop finds any function, it adds it to the stack and runs in order. -Mike Cohn\'s original test pyramid consists of three layers that your test suite should consist of (bottom to top): +```js +function add(a,b){ + return a+b; +} +function print(n){ + console.log(`Two times the number ${n} is `+add(n,n)); +} + +print(5); +``` -1. Unit Tests -1. Service Tests -1. User Interface Tests +Here, when the code executes, the function print(5) will be invoked and will push into the call stack. When the function is called, it starts consoling the statement inside it but before consoling the whole statement it encounters another function add(n,n) and suspends its current execution, and pushes the add function into the top of the call stack. Now the function will return the addition a+b and then popped out from the stack and now the previously suspended function will start running and will log the output to console and then this function too will get pop from the stack and now the stack is empty. So this is how a call stack works. -## Q. ***How can you secure your HTTP cookies against XSS attacks?*** +## Q. ***What does emitter do and what is dispatcher?*** -**1.** When the web server sets cookies, it can provide some additional attributes to make sure the cookies won\'t be accessible by using malicious JavaScript. One such attribute is HttpOnly. - -```javascript -Set-Cookie: [name]=[value]; HttpOnly -``` +Node.js core API is based on asynchronous event-driven architecture in which certain kind of objects called emitters periodically emit events that cause listener objects to be called. -HttpOnly makes sure the cookies will be submitted only to the domain they originated from. +All objects that emit events are members of EventEmitter class. These objects expose an eventEmitter.on() function that allows one or more functions to be attached to named events emitted by the object. -**2.** The "Secure" attribute can make sure the cookies are sent over secured channel only. +When the EventEmitter object emits an event, all of the functions attached to that specific event are called synchronously. All values returned by the called listeners are ignored and will be discarded. -```javascript -Set-Cookie: [name]=[value]; Secure +```js +const EventEmitter = require('events'); +class MyEmitter extends EventEmitter {} +const myEmitter = new MyEmitter(); +myEmitter.on('event', function(a, b) { + console.log(a, b, this); + // Prints: + // Technoetics Club MyEmitter { + // domain: null, + // _events: { event: [Function] }, + // _eventsCount: 1, + // _maxListeners: undefined } +}); +myEmitter.emit('event','Technoetics', 'Club'); ``` -**3.** The web server can use X-XSS-Protection response header to make sure pages do not load when they detect reflected cross-site scripting (XSS) attacks. +Here we create a myEmitter object and emit event at the end which triggers the callback function and we are able to get the desired output. -```javascript -X-XSS-Protection: 1; mode=block -``` +By default, all listeners attached to a particular event object are called by the EventListener object synchronously in the order in which they are registered or attached to the event object. -**4.** The web server can use HTTP Content-Security-Policy response header to control what resources a user agent is allowed to load for a certain page. It can help to prevent various types of attacks like Cross Site Scripting (XSS) and data injection attacks. +**Dispatcher:** -```javascript -Content-Security-Policy: default-src 'self' *.http://sometrustedwebsite.com -``` +The Dispatcher has functionality not provided nor expected in EventEmitter, the most notable being waitFor, which allows a store to ensure that another store has been updated in response to an action before it proceeds. + +Pattern-wise, the Dispatcher is also a singleton, whereas EventEmitter is an API that you might object-assign onto multiple stores. -## Q. ***How can you make sure your dependencies are safe?*** - -The only option is to automate the update / security audit of your dependencies. For that there are free and paid options: +## Q. ***What is the difference between process.nextTick() and setImmediate()?*** -1. npm outdated -2. Trace by RisingStack -3. NSP -4. GreenKeeper -5. Snyk -6. npm audit -7. npm audit fix +The difference between `process.nextTick()` and `setImmediate()` is that `process.nextTick()` defers the execution of an action till the next pass around the event loop or it simply calls the callback function once the ongoing execution of the event loop is finished whereas `setImmediate()` executes a callback on the next cycle of the event loop and it gives back to the event loop for executing any I/O operations. -## Q. ***What is Event loop in Node.js? How does it work?*** +## Q. ***What are the difference between Events and Callbacks?*** -The event loop is what allows Node.js to perform non-blocking I/O operations — despite the fact that JavaScript is single-threaded — by offloading operations to the system kernel whenever possible. +Node.js is a single-threaded application, but it support concurrency via the concept of **event** and **callbacks**. Every API of Node.js is asynchronous and being single-threaded, they use async function calls to maintain concurrency. Node thread keeps an event loop and whenever a task gets completed, it fires the corresponding event which signals the event-listener function to execute. -Node.js is a single-threaded application, but it can support concurrency via the concept of `event` and `callbacks`. Every API of Node.js is asynchronous and being single-threaded, they use `async function calls` to maintain concurrency. Node uses observer pattern. Node thread keeps an event loop and whenever a task gets completed, it fires the corresponding event which signals the event-listener function to execute. +callback functions are called when an asynchronous function returns its result, whereas event handling works on the **observer pattern**. The functions that listen to events act as Observers. Whenever an event gets fired, its listener function starts executing. Node.js has multiple in-built events available through events module and EventEmitter class which are used to bind events and event-listeners -**Event-Driven Programming** +**1. Callback**: A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action. -In an event-driven application, there is generally a main loop that listens for events, and then triggers a callback function when one of those events is detected. +*Example*: synchronous callback -Although events look quite similar to callbacks, the difference lies in the fact that callback functions are called when an asynchronous function returns its result, whereas event handling works on the observer pattern. The functions that listen to events act as Observers. Whenever an event gets fired, its listener function starts executing. Node.js has multiple in-built events available through events module and EventEmitter class which are used to bind events and event-listeners as follows +```js +function greeting(name) { + alert('Hello ' + name); +} -```javascript -// Import events module -var events = require('events'); +function processUserInput(callback) { + var name = prompt('Please enter your name.'); + callback(name); +} -// Create an eventEmitter object -var eventEmitter = new events.EventEmitter(); +processUserInput(greeting); ``` -*Example*: - -```javascript -// Import events module -var events = require('events'); +**2. Events**: Every action on a computer is an event. Node.js allows us to create and handle custom events easily by using events module. Event module includes `EventEmitter` class which can be used to raise and handle custom events. -// Create an eventEmitter object -var eventEmitter = new events.EventEmitter(); +*Example*: -// Create an event handler as follows -var connectHandler = function connected() { - console.log('connection succesful.'); +```js +var event = require('events'); +var eventEmitter = new event.EventEmitter(); - // Fire the data_received event - eventEmitter.emit('data_received'); -} - -// Bind the connection event with the handler -eventEmitter.on('connection', connectHandler); - -// Bind the data_received event with the anonymous function -eventEmitter.on('data_received', function() { - console.log('data received succesfully.'); -}); - -// Fire the connection event -eventEmitter.emit('connection'); +// Add listener function for Sum event +eventEmitter.on('Sum', function(num1, num2) { + console.log('Total: ' + (Number(num1) + Number(num2))); +}); -console.log("Program Ended."); +// Call Event. +eventEmitter.emit('Sum', '10', '20'); ``` -## Q. ***If Node.js is single threaded then how it handles concurrency?*** - -Node js despite being single-threaded is the asynchronous nature that makes it possible to handle concurrency and perform multiple I/O operations at the same time. Node js uses an event loop to maintain concurrency and perform non-blocking I/O operations. +## Q. ***What are the timing features of Node.js?*** -As soon as Node js starts, it initializes an event loop. The event loop works on a queue (which is called an event queue) and performs tasks in FIFO(First In First Out) order. It executes a task only when there is no ongoing task in the call stack. The call stack works in LIFO(Last In First Out) order. The event loop continuously checks the call stack to check if there is any task that needs to be run. Now whenever the event loop finds any function, it adds it to the stack and runs in order. +*ToDo* -```javascript -function add(a,b){ - return a+b; -} -function print(n){ - console.log(`Two times the number ${n} is `+add(n,n)); -} - -print(5); -``` + - Here, when the code executes, the function print(5) will be invoked and will push into the call stack. When the function is called, it starts consoling the statement inside it but before consoling the whole statement it encounters another function add(n,n) and suspends its current execution, and pushes the add function into the top of the call stack. Now the function will return the addition a+b and then popped out from the stack and now the previously suspended function will start running and will log the output to console and then this function too will get pop from the stack and now the stack is empty. So this is how a call stack works. +## # 5. NODE.JS FILE SYSTEM - Source :- GeeksForGeeks +
+## Q. ***How Node.js read the content of a file?*** - +The "normal" way in Node.js is probably to read in the content of a file in a non-blocking, asynchronous way. That is, to tell Node to read in the file, and then to get a callback when the file-reading has been finished. That would allow us to hand several requests in parallel. -## Q. ***What is REPL? What purpose it is used for?*** +Common use for the File System module: -REPL (READ, EVAL, PRINT, LOOP) is a computer environment similar to Shell (Unix/Linux) and command prompt. Node comes with the REPL environment when it is installed. System interacts with the user through outputs of commands/expressions used. It is useful in writing and debugging the codes. The work of REPL can be understood from its full form: +* Read files +* Create files +* Update files +* Delete files +* Rename files -* **Read**: It reads the inputs from users and parses it into JavaScript data structure. It is then stored to memory. -* **Eval**: The parsed JavaScript data structure is evaluated for the results. -* **Print**: The result is printed after the evaluation. -* **Loop**: Loops the input command. To come out of NODE REPL, press ctrl+c twice +**Read Files** +index.html -Simple Expression +```html + + +

My Header

+

My paragraph.

+ + +``` ```js -$ node -> 10 + 20 -30 -> 10 + ( 20 * 30 ) - 40 -570 -> -``` +// read_file.js - +var http = require('http'); +var fs = require('fs'); +http.createServer(function (req, res) { + fs.readFile('index.html', function(err, data) { + res.writeHead(200, {'Content-Type': 'text/html'}); + res.write(data); + res.end(); + }); +}).listen(8080); +``` -## Q. ***What is asynchronous programming in Node.js?*** +Initiate read_file.js: -Asynchronous programming is a form of parallel programming that allows a unit of work to run separately from the primary application thread. When the work is complete, it notifies the main thread (as well as whether the work was completed or failed). There are numerous benefits to using it, such as improved application performance and enhanced responsiveness. +```bash +node read_file.js +``` -## Q. ***What is the difference between Asynchronous and Non-blocking?*** +## # 6. NODE.JS STREAMS -**1. Asynchronous** +
-The architecture of asynchronous explains that the message sent will not give the reply on immediate basis just like we send the mail but do not get the reply on an immediate basis. It does not have any dependency or order. Hence improving the system efficiency and performance. The server stores the information and when the action is done it will be notified. +## Q. ***How many types of streams are present in node.js?*** -**2. Non-Blocking** +Streams are objects that let you read data from a source or write data to a destination in continuous fashion. +There are four types of streams -Nonblocking immediately responses with whatever data available. Moreover, it does not block any execution and keeps on running as per the requests. If an answer could not be retrieved then in those cases API returns immediately with an error. Nonblocking is mostly used with I/O(input/output). Node.js is itself based on nonblocking I/O model. There are few ways of communication that a nonblocking I/O has completed. The callback function is to be called when the operation is completed. Nonblocking call uses the help of javascript which provides a callback function. +* **Readable** − Stream which is used for read operation. +* **Writable** − Stream which is used for write operation. +* **Duplex** − Stream which can be used for both read and write operation. +* **Transform** − A type of duplex stream where the output is computed based on input. -* **Asynchronous VS Non-Blocking** +Each type of Stream is an EventEmitter instance and throws several events at different instance of times. -1) Asynchronous does not respond immediately, While Nonblocking responds immediately if the data is available and if not that simply returns an error. -2) Asynchronous improves the efficiency by doing the task fast as the response might come later, meanwhile, can do complete other tasks. Nonblocking does not block any execution and if the data is available it retrieves the information quickly. -3) Asynchronous is the opposite of synchronous while nonblocking I/O is the opposite of blocking. They both are fairly similar but they are also different as asynchronous is used with a broader range of operations while nonblocking is mostly used with I/O. +*Example*: - +* **data** − This event is fired when there is data is available to read. +* **end** − This event is fired when there is no more data to read. +* **error** − This event is fired when there is any error receiving or writing data. +* **finish** − This event is fired when all the data has been flushed to underlying system. -## Q. ***How to debug an application in Node.js?*** +**Reading from a Stream:** -* **node-inspector** +```js +var fs = require("fs"); +var data = ''; -```bash -npm install -g node-inspector -``` +// Create a readable stream +var readerStream = fs.createReadStream('input.txt'); -Run +// Set the encoding to be utf8. +readerStream.setEncoding('UTF8'); -```bash -node-debug app.js -``` +// Handle stream events --> data, end, and error +readerStream.on('data', function(chunk) { + data += chunk; +}); -* **Debugging** - * Debugger - * Node Inspector - * Visual Studio Code - * Cloud9 - * Brackets +readerStream.on('end',function() { + console.log(data); +}); -* **Profiling** +readerStream.on('error', function(err) { + console.log(err.stack); +}); -```bash -1. node --prof ./app.js -2. node --prof-process ./the-generated-log-file +console.log("Program Ended"); ``` -* **Heapdumps** - * node-heapdump with Chrome Developer Tools +**Writing to a Stream:** -* **Tracing** - * Interactive Stack Traces with TraceGL +```js +var fs = require("fs"); +var data = 'Simply Easy Learning'; -* **Logging** -Libraries that output debugging information - * Caterpillar - * Tracer - * scribbles +// Create a writable stream +var writerStream = fs.createWriteStream('output.txt'); -Libraries that enhance stack trace information -* Longjohn +// Write the data to stream with encoding to be utf8 +writerStream.write(data,'UTF8'); - - -## Q. ***What are some of the most popular packages of Node.js?*** - -* **Async**: Async is a utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript. -* **Browserify**: Browserify will recursively analyze all the require() calls in your app in order to build a bundle you can serve up to the browser in a single `