1. The javascript echo parameter server hapi
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ cat server/index.js
const Hapi = require('hapi');
class EchoServerHapi{
constructor(args){
this.server = Hapi.server(args);
}
async init(){
try {
await this.routing();
await this.server.start();
console.log(`Here we have the echo Server Hapi running:: ${this.server.info.uri}`);
} catch (error) {
console.log('Error while trying to run echo Server Hapi:: ' + error.message);
}
}
async routing(){
this.server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
return 'Hello, Javascript Developer! ! !\n';
}
});
this.server.route({
method: 'GET',
path: '/{name}',
handler: (request, h) => {
return 'Hello, ' + encodeURIComponent(request.params.name) + '!\n';
}
});
this.server.route({
method: 'POST',
path: '/msg',
handler: (request, h) => {
return "POSTing:: "+JSON.stringify(request.payload) + '\n';
}
});
this.server.route({
method: 'PUT',
path: '/msg',
handler: (request, h) => {
return "PUTing:: "+JSON.stringify(request.payload) + '\n';
}
});
this.server.route({
method: 'DELETE',
path: '/{name}',
handler: (request, h) => {
return 'Bye, ' + encodeURIComponent(request.params.name) + '!\n';
}
});
}
}
/* LOOK THIS COMMENT, NO localhost, just 0.0.0.0 */
/*const firstEchoServer = new EchoServerHapi({
port: 3001,
host: 'localhost',
app: {}
});*/
const firstEchoServer = new EchoServerHapi({
port: 3001,
host: '0.0.0.0',
app: {}
});
firstEchoServer.init();
2. The node package.json done with npm
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ cat package.json
{
"name": "rest_echo_hapi",
"version": "1.0.0",
"description": "This README would normally document whatever steps are necessary to get your application up and running.",
"main": "server/index.js",
"scripts": {
"start": "node server/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "maximilianou@gmail.com",
"license": "MIT",
"dependencies": {
"hapi": "^17.8.1",
"isemail": "^3.2.0"
}
}
3. The Dockerfile to run and modify the javascript program
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ cat Dockerfile
FROM node
WORKDIR /code
RUN npm set prefix /usr/local && npm install -g nodemon
COPY package.json /code/package.json
RUN npm set prefix /usr/local && npm install && npm ls
RUN mv /code/node_modules /node_modules
COPY . /code
#EXPOSE 3000 # expose but no publish, except useing docker -P
CMD ["npm", "start"]
4. The docker compose to run the composition of service docker having volume shared path
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ cat docker-compose.yml
version: "2"
services:
web:
build: .
command: nodemon -L --inspect=0.0.0.0:5858
volumes:
- .:/code
ports:
- "3001:3001"
- "5858:5858"
5. Starting from command line with npm, from package.json
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ npm start
> rest_echo_hapi@1.0.0 start /home/educacion/src/resthapi/v2/rest_echo_hapi
> node server/index.js
Here we have the echo Server Hapi running:: http://0.0.0.0:3001
6. Starting from docker compose
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ docker-compose up
Starting restechohapi_web_1
Attaching to restechohapi_web_1
web_1 | [nodemon] 1.18.7
web_1 | [nodemon] to restart at any time, enter `rs`
web_1 | [nodemon] watching: *.*
web_1 | [nodemon] starting `node --inspect=0.0.0.0:5858 server/index.js`
web_1 | Debugger listening on ws://0.0.0.0:5858/e6293311-3e2c-4f77-af38-d087a52d30c3
web_1 | For help, see: https://nodejs.org/en/docs/inspector
web_1 | Here we have the echo Server Hapi running:: http://0.0.0.0:3001
7. Checking GET, POST, PUT and DELETE echoing the parameter in each case.
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ curl http://0.0.0.0:3001
Hello, Javascript Developer! ! !
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ curl http://127.0.0.1:3001
Hello, Javascript Developer! ! !
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ curl http://localhost:3001
Hello, Javascript Developer! ! !
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ curl http://localhost:3001/Hijitus
Hello, Hijitus!
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ curl --request DELETE http://localhost:3001/Larguirucho
Bye, Larguirucho!
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ curl --header "Content-Type: application/json" --request POST --data '{"name":"Pucho"}' http://localhost:3001/msg
POSTing:: {"name":"Pucho"}
educacion@educacion:~/src/resthapi/v2/rest_echo_hapi$ curl --header "Content-Type: application/json" --request PUT --data '{"name":"Profesor Neurus"}' http://localhost:3001/msg
PUTing:: {"name":"Profesor Neurus"}
Think the best of others
Wednesday, December 26, 2018
docker rest api hapijs nodejs vscode realtime development
Friday, December 21, 2018
rest hapi echo
1. At first, we create the repository, i'm using bitbucket and mercurial
2. We clone the repository locally
educacion@educacion:~/src/resthapi$ hg clone https://bitbucket.org/maximilianou/rest_echo_hapi/
3. List this folder to see the files.
educacion@educacion:~/src/resthapi$ ls
rest_echo_hapi
4. Change Dir, inside the path where you will have the code.
educacion@educacion:~/src/resthapi$ cd rest_echo_hapi/
educacion@educacion:~/src/resthapi/rest_echo_hapi$ ls -a
. .. .hg LICENSE.txt README.md
5. Create the package.json
educacion@educacion:~/src/resthapi/rest_echo_hapi$ npm init -y
6. let see the repository files status sync
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg status
? package.json
7. Add new files
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg add .
8. Verify the locally status change.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg status
A package.json
9. Commit changes in the local repository.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg commit -m 'initial commit' -u maximilianou@gmail.com
10. Upload Changes to the remote repository ( origin master )
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg push
11. Let's install Hapijs
educacion@educacion:~/src/resthapi/rest_echo_hapi$ npm install hapi --save
12. Verify the changes in package.json
educacion@educacion:~/src/resthapi/rest_echo_hapi$ cat package.json
{
"name": "rest_echo_hapi",
"version": "1.0.0",
"description": "This README would normally document whatever steps are necessary to get your application up and running.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"hapi": "^17.8.1"
}
}
13. Add to .hgignore what does'nt have to be sync to the central ( remote ) repository.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ vi .hgignore
14. Let's see the content of my hgignore now.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ cat .hgignore
# Add any directories, files, or patterns you don't want to be tracked by version control
# Project #
# System #
.DS_Store
# Mercurial #
.orig
# Node #
node_modules/
# Grunt build #
dist/
# Bower #
bower_components/
public/system/lib
.bower-cache/
.bower-registry/
.bower-tmp/
.tmp/
# IDE #
nbproject/
.idea/
atlassian-ide-plugin.xml
15. Add configuration files for this instance of reposisory.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg add .
adding .hgignore
adding package-lock.json
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg status
M package.json
A .hgignore
A package-lock.json
16. Commit this repository sanity change.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg commit -m 'repository sanity' -u maximilianou@gmail.com
17. Upload to the central repository
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg push
18. Now, we can create a directory structure, just to beginning with the right foot, then walk.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ mkdir server
19. Create our first javascript server file, or program.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ touch server/index.js
20. Here we create the server in port 3000, localhost. Object Oriented Programming.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ cat server/index.js
const Hapi = require('hapi');
class EchoServerHapi{
constructor(args){
this.server = Hapi.server(args);
};
async init(){
try {
await this.server.start();
console.log(`Here we have the echo Server Hapi running:: ${this.server.info.uri}`);
} catch (error) {
console.log('Error while trying to run echo Server Hapi:: ' + error.message);
}
};
};
const firstEchoServer = new EchoServerHapi({
port: 3000,
host: 'localhost',
app: {}
});
firstEchoServer.init();
21. It is running.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ node server/index.js
Here we have the echo Server Hapi running:: http://localhost:3000
22. And.. the route is not specified.
educacion@educacion:~$ curl http://localhost:3000/
{"statusCode":404,"error":"Not Found","message":"Not Found"}
23. Adding some route. Simple way at first, just a method routing() in the class.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ cat server/index.js
const Hapi = require('hapi');
class EchoServerHapi{
constructor(args){
this.server = Hapi.server(args);
}
async init(){
try {
await this.routing();
await this.server.start();
console.log(`Here we have the echo Server Hapi running:: ${this.server.info.uri}`);
} catch (error) {
console.log('Error while trying to run echo Server Hapi:: ' + error.message);
}
}
async routing(){
this.server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
return 'Hello, Javascript Developer!\n';
}
});
this.server.route({
method: 'GET',
path: '/{name}',
handler: (request, h) => {
return 'Hello, ' + encodeURIComponent(request.params.name) + '!\n';
}
});
}
}
const firstEchoServer = new EchoServerHapi({
port: 3000,
host: 'localhost',
app: {}
});
firstEchoServer.init();
24. running the server, from the command line.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ node server/index.js
Here we have the echo Server Hapi running:: http://localhost:3000
25. Checking the path /
educacion@educacion:~/src/resthapi/rest_echo_hapi$ curl http://localhost:3000/
Hello, Javascript Developer!
26. Checking the path /Mafalda, just an Example Case!!
educacion@educacion:~/src/resthapi/rest_echo_hapi$ curl http://localhost:3000/Mafalda
Hello, Mafalda!
27. Upload changes to the central repository.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg status
M server/index.js
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg commit -u maximilianou@gmail.com -m 'Hello URL routing()'
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg status
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg push
28. Now, adding GET, POST, PUT to our near rest echo.
const Hapi = require('hapi');
class EchoServerHapi{
constructor(args){
this.server = Hapi.server(args);
}
async init(){
try {
await this.routing();
await this.server.start();
console.log(`Here we have the echo Server Hapi running:: ${this.server.info.uri}`);
} catch (error) {
console.log('Error while trying to run echo Server Hapi:: ' + error.message);
}
}
async routing(){
this.server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
return 'Hello, Javascript Developer!\n';
}
});
this.server.route({
method: 'GET',
path: '/{name}',
handler: (request, h) => {
return 'Hello, ' + encodeURIComponent(request.params.name) + '!\n';
}
});
this.server.route({
method: 'POST',
path: '/msg',
handler: (request, h) => {
return "POSTing:: "+JSON.stringify(request.payload) + '\n';
}
});
this.server.route({
method: 'PUT',
path: '/msg',
handler: (request, h) => {
return "PUTing:: "+JSON.stringify(request.payload) + '\n';
}
});
}
}
const firstEchoServer = new EchoServerHapi({
port: 3000,
host: 'localhost',
app: {}
});
firstEchoServer.init();
29. Now, checking the post and put, with --data, body of http for POST and PUT, Reference: https://tools.ietf.org/html/rfc2616
educacion@educacion:~/src/resthapi/rest_echo_hapi$ curl --header "Content-Type: application/json" --request POST --data '{"clave":"valor"}' http://localhost:3000/msg
POSTing:: {"clave":"valor"}
educacion@educacion:~/src/resthapi/rest_echo_hapi$ curl --header "Content-Type: application/json" --request PUT --data '{"clave":"valor"}' http://localhost:3000/msg
PUTing:: {"clave":"valor"}
30. Commiting changes to the central repository.
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg status
M server/index.js
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg commit -u maximilianou@gmail.com -m 'post, put method echo'
educacion@educacion:~/src/resthapi/rest_echo_hapi$ hg push
31. Compliting echo rest, get, post, put, and DELETE here
const Hapi = require('hapi');
class EchoServerHapi{
constructor(args){
this.server = Hapi.server(args);
}
async init(){
try {
await this.routing();
await this.server.start();
console.log(`Here we have the echo Server Hapi running:: ${this.server.info.uri}`);
} catch (error) {
console.log('Error while trying to run echo Server Hapi:: ' + error.message);
}
}
async routing(){
this.server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
return 'Hello, Javascript Developer!\n';
}
});
this.server.route({
method: 'GET',
path: '/{name}',
handler: (request, h) => {
return 'Hello, ' + encodeURIComponent(request.params.name) + '!\n';
}
});
this.server.route({
method: 'POST',
path: '/msg',
handler: (request, h) => {
return "POSTing:: "+JSON.stringify(request.payload) + '\n';
}
});
this.server.route({
method: 'PUT',
path: '/msg',
handler: (request, h) => {
return "PUTing:: "+JSON.stringify(request.payload) + '\n';
}
});
this.server.route({
method: 'DELETE',
path: '/{name}',
handler: (request, h) => {
return 'Bye, ' + encodeURIComponent(request.params.name) + '!\n';
}
});
}
}
const firstEchoServer = new EchoServerHapi({
port: 3000,
host: 'localhost',
app: {}
});
firstEchoServer.init();
32. Checking HTTP DELETE, data into the url, like http get.
educacion@educacion:~$ curl --request DELETE http://localhost:3000/Pedrito
Bye, Pedrito!
Monday, December 17, 2018
Docker 12 Factor Methodology Step 01 Codebase Repository git
$ git clone https://bitbucket.org/maximilianou/messageapp educacion@educacion:~/src/docker12factor/messageapp$ git status educacion@educacion:~/src/docker12factor/messageapp$ git add . educacion@educacion:~/src/docker12factor/messageapp$ git commit -m 'first commit' educacion@educacion:~/src/docker12factor/messageapp$ git push origin master
Docker 12 Factors Methodology Step 00 Application NodeJS Debian REST api
root@educacion:/home/educacion/src/docker12factor# apt install dirmngr root@educacion:/home/educacion/src/docker12factor# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 root@educacion:/home/educacion/src/docker12factor# echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.0 main" | tee /etc/apt/sources.list.d/mongodb-org-4.0.list root@educacion:/home/educacion/src/docker12factor# apt update -y root@educacion:/home/educacion/src/docker12factor# apt install -y mongodb-org root@educacion:/home/educacion/src/docker12factor# service mongod status root@educacion:/home/educacion/src/docker12factor# service mongod start root@educacion:/home/educacion/src/docker12factor# mongo > help; > exit; educacion@educacion:~/src/docker12factor$ npm init educacion@educacion:~/src/docker12factor$ npm get prefix /usr educacion@educacion:~/src/docker12factor$ npm set prefix /usr/local educacion@educacion:~/src/docker12factor$ npm get prefix /usr/local educacion@educacion:~/src/docker12factor$ npm install sails -g educacion@educacion:~/src/docker12factor$ sails new messageApp Choose a template for your new Sails app: 1. Web App · Extensible project with auth, login, & password recovery 2. Empty · An empty Sails app, yours to configure (type "?" for help, orto cancel) ? 2 educacion@educacion:~/src/docker12factor$ cd messageApp educacion@educacion:~/src/docker12factor$ sails generate api message educacion@educacion:~/src/docker12factor$ sails lift educacion@educacion:~/src/docker12factor/messageApp$ curl --header "Content-Type: application/json" --request POST --data '"text":"Hello Javascript FullStack DevOps"}' http://localhost:1337/message educacion@educacion:~/src/docker12factor/messageApp$ curl --header "Content-Type: application/json" --request POST --data '"text":"Hola Javascript FullStack DevOps"}' http://localhost:1337/message educacion@educacion:~/src/docker12factor/messageApp$ curl http://localhost:1337/message/ [ { "text": "Hello Javascript FullStack DevOps", "createdAt": 1545061317524, "updatedAt": 1545061317524, "id": 1 }, { "text": "Hola Javascript FullStack DevOps", "createdAt": 1545061415586, "updatedAt": 1545061415586, "id": 2 } ] educacion@educacion:~/src/docker12factor/messageApp$ curl --header "Content-Type: application/json" --request PUT --data '{"ext":"Hello Javascript FullStack !! DevOps !!"}' http://localhost:1337/message/2 educacion@educacion:~/src/docker12factor/messageApp$ curl http://localhost:1337/message/ [ { "text": "Hello Javascript FullStack DevOps", "createdAt": 1545061317524, "updatedAt": 1545061317524, "id": 1 }, { "text": "Hello Javascript FullStack !! DevOps !!", "createdAt": 1545061415586, "updatedAt": 1545065865167, "id": 2 } ] educacion@educacion:~/src/docker12factor/messageApp$ curl --request DELETE http://localhost:1337/message/1 educacion@educacion:~/src/docker12factor/messageApp$ curl http://localhost:1337/message/ [ { "text": "Hello Javascript FullStack !! DevOps !!", "createdAt": 1545061415586, "updatedAt": 1545065865167, "id": 2 } ] Reference: https://github.com/docker/labs/blob/master/12factor/00_application.md https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/
Tuesday, December 4, 2018
docker nodejs IDE visual studio 2018
educacion@educacion:~/src/docker02$ cat Dockerfile
FROM node
WORKDIR /code
RUN npm install -g nodemon
COPY package.json /code/package.json
RUN npm install && npm ls
RUN mv /code/node_modules /node_modules
COPY . /code
CMD ["npm", "start"]
educacion@educacion:~/src/docker02$ cat docker-compose.yml
version: "2"
services:
web:
build: .
command: nodemon -L --inspect=0.0.0.0:5858
volumes:
- .:/code
ports:
- "8000:8000"
- "5858:5858"
educacion@educacion:~/src/docker02$ cat package.json
{
"main": "app.js",
"dependencies": {
"express": "~4.14.0",
"express-handlebars": "~3.0.0"
}
}
educacion@educacion:~/src/docker02$ cat app.js
const express = require('express');
const expressHandlebars = require('express-handlebars');
const http = require('http');
const PORT = 8000;
const LINES = [
"One thing at the time.",
"Start from the beginning!",
"Up to date!",
"As Simple As Possible",
];
let lineIndex = 0;
const app = express();
app.engine('html', expressHandlebars());
app.set('view engine', 'html');
app.set('views', __dirname);
app.get('/', (req, res) => {
let message = LINES[lineIndex];
lineIndex += 1;
if (lineIndex >= LINES.length) {
lineIndex = 0;
}
res.render('index', {message: message});
});
http.Server(app).listen(PORT, () => {
console.log("HTTP server listening on port %s", PORT);
});
educacion@educacion:~/src/docker02$ cat index.html
< !doctype html>
< html>
< head>
< meta http-equiv="refresh" content="2">
< style type="text/css">
.sample_docker_nodejs {
font-family: Helvetica, Arial, sans-serif;
font-weight: 600;
font-size: 56pt;
text-transform: uppercase;
text-align: center;
background: #3c3;
color: white;
}
< /style>
< /head>
< body class='sample_docker_nodejs'>“{{message}}”