Node.js
Installation
- (New) https://nodejs.org/en/download/
- (Old) http://www.thegeekstuff.com/2015/10/install-nodejs-npm-linux/ and the instruction offered by the R's shiny server website.
See also my note on Javascript
Install on Ubuntu
How to Install Latest Node.js and NPM on Ubuntu with PPA
sudo apt-get install curl python-software-properties curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt-get install nodejs
Check the versions
$ node -v # v12.3.1 $ npm -v # 6.9.0
Install on Mac
- https://nodejs.org/en/
- 65MB space is needed
- Node.js v10.16.3 will be in /usr/local/bin/node
- npm v6.9.0 will be in /usr/local/bin/npm
Install on Raspberry Pi
How to install NodeJS on a Raspberry Pi
uname -m wget https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-armv6l.tar.xz tar -xvf node-v8.11.3-linux-armv6l.tar.xz cd node-v8.11.3-linux-armv6l rm CHANGELOG.md LICENSE README.md cp -R * /usr/local/ node -v npm -v
Error from sudo apt-get install nodejs npm
$ sudo apt-get install nodejs npm The following packages have unmet dependencies: nodejs: Conflicts: npm E: Unable to correct problems, you have held broken packages. $ node --version
Teh nodejs package includes npm since v0.10.0..
Error from running npm
$ sudo npm install gtop -g .... Failed to parse json .... Failed to parse package.json data package.json must be actual JSON, not just Javascript This is not a bug in npm Tell the package author to fix their package.json file. JSON.parse
One solution that works in my case is
npm cache clean
Tutorials
- https://www.w3schools.com/nodejs/default.asp
- https://www.tutorialspoint.com/nodejs/index.htm
- https://www.javatpoint.com/nodejs-tutorial
- Node.js Tutorial for Beginners: Learn Node in 1 Hour | Mosh
node.js prompt
How to exit
brb@brb-P45T-A:~/Downloads$ node > Math.random() 0.14142140373587608 > .exit
HTTP server
http://www.youtube.com/watch?v=jo_B4LTHi3I
Note HTTP is just one application of TCP.
First create a js file
var http = require('http'); var s = http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello \n'); setTimeout(function() { res.end("world\n"); }, 2000); }); s.listen(8000);
Then using node program to run the js script. We can test the program by using a web browser or curl program.
# Terminal 1 node web-server.js # Terminal 2 curl http://localhost:8000 OR use "-i" to include HTTP-header in the output curl -i http://localhost:8000
The output I get is
$ curl -i http://localhost:8000 HTTP/1.1 200 OK Content-Type: text/plain Date: Sat, 19 Oct 2013 20:55:17 GMT Connection: keep-alive Transfer-Encoding: chunked Hello world
We can compare this with the Example from Hypertext Transfer Protocol in Wikipedia.
Test the http server
ab -n 1000 -c 100 http://localhost:8000
Setup Nginx as Frontend Server for Node.js
- How to Install Latest Node.js and NPM on Ubuntu with PPA
- How to Setup Nginx as Frontend Server for Node.js
TCP server
Simple example
Create <tcp-server.js> file
var net= require('net') var server = net.createServer(function(socket) { socket.write('hello\n'); socket.end('world\n'); }); server.listen(8000);
After running this program, we can test it by using telnet or nc.
telnet localhost 8000 OR nc localhost 8000
Echo server
This is modified from Simple server.
var net= require('net') var server = net.createServer(function(socket) { socket.write('hello\n'); socket.write('world\n'); socket.on('data', function(data) { socket.write(data); }); }); server.listen(8000);
We can use netstat -an | grep tcp to lists all the TCP ports on which your Linux server is listening including all the active network connections to and from your server. This can be very helpful in determining whether slowness is due to high traffic volumes:
telnet needs to use Ctrl+] to break out the connection but nc can disconnect by using Ctrl+C.
$ telnet localhost 8000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. hello world klllkafda klllkafda ^] telnet> quit Connection closed. $ $ nc localhost 8000 hello world adaf adaf ^C $
Chat server
net = require('net'); var sockets = []; var s = net.Server(function(socket) { sockets.push(socket); socket.on('data', function(d) { for(var i=0; i<sockets.length; i++) { if (sockets[i] == socket) continue; sockets[i].write(d); } }); socket.on('end', function() { var i = socksets.indexOf(socket); sockets.splice(i, 1); }); }); s.listen(8000);
Test it by
Terminal 1: telnet localhost 8000
Terminal 2: telnet localhost 8000
http get
Node.js - RESTful API from tutorialspoint.com
$ cat hello-world-server.js setInterval(function() { console.log("world"); }, 2000) console.log("hello"); var http = require('http') setInterval(function() { console.log("fetching google.com"); http.get({ host: 'google.com' }, function(res) { console.log(res.headers); }); }, 2000) console.log("hello");
Modules and npm
https://www.javatpoint.com/nodejs-package-manager
- npm version
$ npm version { npm: '6.9.0', ares: '1.15.0', brotli: '1.0.7', cldr: '35.1', http_parser: '2.8.0', icu: '64.2', modules: '64', napi: '4', nghttp2: '1.39.2', node: '10.16.3', openssl: '1.1.1c', tz: '2019a', unicode: '12.1', uv: '1.28.0', v8: '6.8.275.32-node.54', zlib: '1.2.11' }
- npm install <Module Name>
$ npm install tz npm WARN saveError ENOENT: no such file or directory, open '/Users/limingc/Downloads/package.json' npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN enoent ENOENT: no such file or directory, open '/Users/limingc/Downloads/package.json' npm WARN Downloads No description npm WARN Downloads No repository field. npm WARN Downloads No README data npm WARN Downloads No license field. + [email protected] added 2 packages from 1 contributor and audited 2 packages in 0.904s found 0 vulnerabilities $ ls -lt | head # package-lock.json & node_modules are created