cakephp 3.8.13 handle unauthorized request, response in JSON - cakephp
I have implemented https://github.com/ADmad/cakephp-jwt-auth in my CakePHP application. My problem is whenever there is an unauthorized request it responds with HTML.
<html>
<head>
<meta charset="utf-8"/>
<title>
CakePHP: the rapid development php framework:
Error </title>
<link href="/favicon.ico" type="image/x-icon" rel="icon"/>
<link href="/favicon.ico" type="image/x-icon" rel="shortcut icon"/>
<link rel="stylesheet" href="/css/cake.generic.css"/>
</head>
<body>
<div id="container">
<div id="header">
<h1>
CakePHP: the rapid development php framework
</h1>
</div>
<div id="content">
<h2>Unauthorized</h2>
<p class="error">
<strong>Error: </strong>
An Internal Error Has Occurred.
</p>
</div>
</div>
</body>
</html>
But according to this tutorial https://www.bravo-kernel.com/2015/04/how-to-add-jwt-authentication-to-a-cakephp-3-rest-api/, it will respond with JSON. An example response from the tutorial is
{
"success": false,
"data": {
"message": "You are not authorized to access that location.",
"url": "\/api\/cocktails.json",
"code": 401
}
}
This is my router
Router::prefix('api', function ($routes) {
$routes->extensions(['json', 'xml']);
Router::connect('/api/check', ['_method' => 'GET','controller' => 'EmailNotification', 'action' => 'check', 'prefix' => 'api']);
$routes->fallbacks('DashedRoute');
});
How can I handle this? I want the unauthorised response in JSON. Thank you.
can you try sending your http request with Accept:application/json header
Related
Refresh token in Gmail API?
After successful login, I am getting access token, expire token type, and this stuff in my console by "console.log("my response ",response)". But there is no refresh token. how to get a refresh token. And 2nd question is, How to get an access token using a refresh token? I am using JavaScript. And guide me is this a best way way to get an access token? Successful login is not giving refresh token, without refresh token how can I refresh my access token? Here is my code <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>FIFV Dashboard</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap#5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <link rel="stylesheet" href="home.css"> <script src="https://apis.google.com/js/api.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons#1.9.1/font/bootstrap-icons.css"> </head> <body> <div class="wrapper fadeInDown"> <div id="formContent"> <!-- Tabs Titles --> <!-- Icon --> <div class="fadeIn first"> <img src="Images/company Logo.png" id="icon" alt="User Icon" /> </div> <!-- Login Form --> <form> <h3 class="heading"> Welcome to FIFV authentication </h3> <p class="shortPara">Please authenticate yourself to get access to the dashboard.</p> <!-- <input type="submit" class="fadeIn fourth" value="Log In" href="Home.html"> --> <br> <button onclick="authenticate().then(loadClient)" type="button" class="btn"><a>Authorise</a></button> <p id="errorMsg"></p> </form> </div> </div> <script> /** * Sample JavaScript code for gmail.users.messages.list * See instructions for running APIs Explorer code samples locally: * https://developers.google.com/explorer-help/code-samples#javascript */ // Authentication code function authenticate() { return gapi.auth2.getAuthInstance() .signIn({ scope: "https://www.googleapis.com/auth/gmail.modify https://www.googleapis.com/auth/gmail.compose https://www.googleapis.com/auth/gmail.readonly" }) .then(function (response) { console.log("Sign-in successful", response); console.log("Access Token", response.Bc.access_token) localStorage.setItem("accessToken", response.Bc.access_token) localStorage.setItem("expire", response.Bc.expires_in) }, function (err) { console.error("Error signing in", err); }); } function loadClient() { gapi.client.setApiKey("my-api-key"); return gapi.client.load("https://gmail.googleapis.com/$discovery/rest?version=v1") .then(function () { console.log("GAPI client loaded for API"); }, function (err) { console.error("Error loading GAPI client for API", err); document.getElementById('errorMsg').innerHTML = err; }); } gapi.load("client:auth2", function () { gapi.auth2.init({ client_id: "my-client-id", plugin_name: "hello" }); }); function logout() { fetch("https://oauth2.googleapis.com/revoke?token=" + token, { method: 'POST', headers: { "Content-type": "application/x-www-form-urlencoded" } }) .then((data) => { location.href = "http://localhost:5500/index.html" }) } </script> <script src="home.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap#5.2.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/#popperjs/core#2.11.6/dist/umd/popper.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap#5.2.3/dist/js/bootstrap.min.js"></script> <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> </body> </html>
I was reviewing the Google Documentation for JavaScript, and I found the following sample that might help you: if (gapi.client.getToken() === null) { // Prompt the user to select a Google Account and ask for consent to share their data // when establishing a new session. tokenClient.requestAccessToken({prompt: 'consent'}); } else { // Skip display of account chooser and consent dialog for an existing session. tokenClient.requestAccessToken({prompt: ''}); } } You can read more information about this here, and information about the refresh token can be found here. Lastly, you can read the information in this question. It has a lot of information about the refresh token.
Wow slider with react.js is not working
I have created a page with fullpage.js and in one of the sections I've integrated wow slider. Same thing is working perfectly in html page but not when integrated in react.js. Getting following error. Uncaught TypeError: Cannot read property 'replace' of undefined at N Script for wow slider function ws_glass_parallax(d,l,m){var f=jQuery;var i=f(this);var j=d.parallax||0.25;var k=f("<div>").css({position:"absolute",display:"none",top:0,left:0,width:"100%",height:"100%",overflow:"hidden"}).addClass("ws_effect ws_glass_parallax").appendTo(m);var h=!d.noCanvas&&!window.opera&&!!document.createElement("canvas").getContext;if(h){try{document.createElement("canvas").getContext("2d").getImageData(0,0,1,1)}catch(q){h=0}}function t(e){return Math.round(e*1000)/1000}var u=f("<div>").css({position:"absolute",left:0,top:0,overflow:"hidden",width:"100%",height:"100%",transform:"translate3d(0,0,0)",zIndex:1}).appendTo(k);var s=u.clone().appendTo(k);var r=u.clone().css({width:"20%"}).appendTo(k);var c;var p=u.clone().appendTo(k).css({zIndex:0});this.go=function(C,A,x){var e=f(l.get(A));e={position:"absolute",width:e.width(),height:e.height(),marginTop:e.css("marginTop"),marginLeft:e.css("marginLeft")};x=x?1:-1;var E=f(l.get(A)).clone().css(e).appendTo(u);var z=f(l.get(C)).clone().css(e).appendTo(s);var v=f(l.get(C)).clone().css(e).appendTo(r);if(x==-1){r.css({left:"auto",right:0});v.css({left:"auto",right:0})}else{r.css({left:0,right:"auto"});v.css({left:0,right:"auto"})}var D=(m.width()||d.width)*1.3;var B=m.height()||d.height;var y;if(h){if(!c){c=f("<canvas>").css({position:"absolute",left:0,top:0}).attr({width:e.width,height:e.height}).appendTo(p)}c.css(e).attr({width:e.width,height:e.height});y=o(f(l.get(C)),e,10,c.get(0))}if(!h||!y){h=0}wowAnimate(function(G){G=f.easing.swing(G);var L=t(x*G*D),F=t(x*(-D+G*D-(1-G)*D*0.2)),J=t(x*(-D*1.4+G*(D*1.4+D/1.3))),w=t(-x*D*j*G),H=t(x*D*j*(1-G)),I=t(-x*D*(j+0.2)*G),K=t(x*(-D*0.2+G*D*0.4));if(d.support.transform){u.css("transform","translate3d("+L+"px,0,0)");E.css("transform","translate3d("+w+"px,0,0)");s.css("transform","translate3d("+F+"px,0,0)");z.css("transform","translate3d("+H+"px,0,0)");r.css("transform","translate3d("+J+"px,0,0)");v.css("transform","scale(1.6) translate3d("+I+"px,0,0)");p.css("transform","translate3d("+K+"px,0,0)")}else{u.css("left",L);E.css("margin-left",w);s.css("left",F);z.css("margin-left",H);r.css("left",J);v.css("margin-left",I);p.css("left",K)}},0,1,d.duration,function(){k.hide();E.remove();z.remove();v.remove();i.trigger("effectEnd")})};function o(C,A,B,v){var F=(parseInt(C.parent().css("z-index"))||0)+1;if(h){var I=v.getContext("2d");I.drawImage(C.get(0),0,0,A.width,A.height);if(!a(I,0,0,v.width,v.height,B)){return 0}return f(v)}var J=f("<div></div>").css({position:"absolute","z-index":F,left:0,top:0}).css(A).appendTo(v);var H=(Math.sqrt(5)+1)/2;var w=1-H/2;for(var z=0;w*z<B;z++){var D=Math.PI*H*z;var e=(w*z+1);var G=e*Math.cos(D);var E=e*Math.sin(D);f(document.createElement("img")).attr("src",C.attr("src")).css({opacity:1/(z/1.8+1),position:"absolute","z-index":F,left:Math.round(G)+"px",top:Math.round(E)+"px",width:"100%",height:"100%"}).appendTo(J)}return J}var g=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];var n=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function a(am,U,S,v,w,ad){if(isNaN(ad)||ad<1){return}ad|=0;var ah;try{ah=am.getImageData(U,S,v,w)}catch(al){console.log("error:unable to access image data: "+al);return false}var C=ah.data;var ab,aa,aj,ag,J,M,G,A,B,R,H,T,P,X,ac,K,F,L,N,W;var ak=ad+ad+1;var Y=v<<2;var I=v-1;var af=w-1;var E=ad+1;var ae=E*(E+1)/2;var V=new b();var Q=V;for(aj=1;aj<ak;aj++){Q=Q.next=new b();if(aj==E){var D=Q}}Q.next=V;var ai=null;var Z=null;G=M=0;var O=g[ad];var z=n[ad];for(aa=0;aa<w;aa++){X=ac=K=A=B=R=0;H=E*(F=C[M]);T=E*(L=C[M+1]);P=E*(N=C[M+2]);A+=ae*F;B+=ae*L;R+=ae*N;Q=V;for(aj=0;aj<E;aj++){Q.r=F;Q.g=L;Q.b=N;Q=Q.next}for(aj=1;aj<E;aj++){ag=M+((I<aj?I:aj)<<2);A+=(Q.r=(F=C[ag]))*(W=E-aj);B+=(Q.g=(L=C[ag+1]))*W;R+=(Q.b=(N=C[ag+2]))*W;X+=F;ac+=L;K+=N;Q=Q.next}ai=V;Z=D;for(ab=0;ab<v;ab++){C[M]=(A*O)>>z;C[M+1]=(B*O)>>z;C[M+2]=(R*O)>>z;A-=H;B-=T;R-=P;H-=ai.r;T-=ai.g;P-=ai.b;ag=(G+((ag=ab+ad+1)<I?ag:I))<<2;X+=(ai.r=C[ag]);ac+=(ai.g=C[ag+1]);K+=(ai.b=C[ag+2]);A+=X;B+=ac;R+=K;ai=ai.next;H+=(F=Z.r);T+=(L=Z.g);P+=(N=Z.b);X-=F;ac-=L;K-=N;Z=Z.next;M+=4}G+=v}for(ab=0;ab<v;ab++){ac=K=X=B=R=A=0;M=ab<<2;H=E*(F=C[M]);T=E*(L=C[M+1]);P=E*(N=C[M+2]);A+=ae*F;B+=ae*L;R+=ae*N;Q=V;for(aj=0;aj<E;aj++){Q.r=F;Q.g=L;Q.b=N;Q=Q.next}J=v;for(aj=1;aj<=ad;aj++){M=(J+ab)<<2;A+=(Q.r=(F=C[M]))*(W=E-aj);B+=(Q.g=(L=C[M+1]))*W;R+=(Q.b=(N=C[M+2]))*W;X+=F;ac+=L;K+=N;Q=Q.next;if(aj<af){J+=v}}M=ab;ai=V;Z=D;for(aa=0;aa<w;aa++){ag=M<<2;C[ag]=(A*O)>>z;C[ag+1]=(B*O)>>z;C[ag+2]=(R*O)>>z;A-=H;B-=T;R-=P;H-=ai.r;T-=ai.g;P-=ai.b;ag=(ab+(((ag=aa+E)<af?ag:af)*v))<<2;A+=(X+=(ai.r=C[ag]));B+=(ac+=(ai.g=C[ag+1]));R+=(K+=(ai.b=C[ag+2]));ai=ai.next;H+=(F=Z.r);T+=(L=Z.g);P+=(N=Z.b);X-=F;ac-=L;K-=N;Z=Z.next;M+=v}}am.putImageData(ah,U,S);return true}function b(){this.r=0;this.g=0;this.b=0;this.a=0;this.next=null}}; jQuery("#wowslider-container1").wowSlider({effect:"glass_parallax",prev:"",next:"",duration:20*100,delay:20*100,width:640,height:360,autoPlay:false,autoPlayVideo:false,playPause:false,stopOnHover:false,loop:false,bullets:1,caption:true,captionEffect:"traces",controls:false,controlsThumb:false,responsive:2,fullScreen:false,gestures:2,onBeforeStep:0,images:0}); Created app using create-react-app App.js code import React, { Component } from 'react'; import './App.css'; class App extends Component { render() { return ( <div className="App"> <ul id="menu"> <li data-menuanchor="firstPage">firstPage</li> <li data-menuanchor="secondPage">secondPage</li> <li data-menuanchor="3rdPage">3rdPage</li> <li data-menuanchor="4thpage">4thpage</li> <li data-menuanchor="5thpage">5thpage</li> </ul> <div id="fullpage"> <div className="section " id="section0"> <div className="intro"> <p>Your Virtual Assistant</p> <p>Free your time for the things that matter to you.</p> <p>be part of the first release, <br/> duw out shortly</p> Sign up today </div> </div> <div className="section" id="section1"> <div className="intro"> <h1>No limitations!</h1> <p>Content is a priority. Even if it is so large :)</p> </div> </div> <div className="section" id="section2"> <div id="wowslider-container1"> <div className="ws_images"><ul> <li><img src="images/background_1.jpg" alt="Background_1" title="Background_1" id="wows1_0"/></li> <li><img src="images/sample_1.jpg" alt="Sample_1" title="Sample_1" id="wows1_1"/></li> <li><img src="images/sample_2.jpg" alt="javascript carousel" title="Sample_2" id="wows1_2"/></li> <li><img src="images/sample_3.jpg" alt="Sample_3" title="Sample_3" id="wows1_3"/></li> </ul></div> <div className="ws_bullets"><div> <span>1</span> <span>2</span> <span>3</span> <span>4</span> </div></div><div className="ws_script" >css image gallery by WOWSlider.com v8.8m</div> <div className="ws_shadow"></div> </div> </div> <div className="section" id="section3"> <div className="intro"> <h1>No limitations!</h1> <p>Content is a priority. Even if it is so large :)</p> </div> </div> <div className="section" id="section4"> <div className="intro"> <h1>No limitations!</h1> <p>Content is a priority. Even if it is so large :)</p> </div> </div> </div> </div> ); } } export default App; index.html page code <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="theme-color" content="#000000"> <!-- manifest.json provides metadata used when your web app is added to the homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/ --> <link rel="manifest" href="%PUBLIC_URL%/manifest.json"> <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullPage.js/2.8.1/jquery.fullPage.min.css"> <link rel="stylesheet" type="text/css" href="css/examples.css" /> <link rel="stylesheet" type="text/css" href="css/style.css" /> <title>React App</title> </head> <body> <noscript> You need to enable JavaScript to run this app. </noscript> <div id="root"></div> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script> <script type="text/javascript" src="js/scrolloverflow.js"></script> <script type="text/javascript" src="js/jquery.fullPage.js"></script> <script type="text/javascript" src="js/examples.js"></script> <script type="text/javascript" src="js/wowslider.js"></script> <script type="text/javascript" src="js/script.js"></script><script type="text/javascript"> $(document).ready(function() { $('#fullpage').fullpage({ // anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', '5thpage'], sectionsColor: ['#4A6FB1', '#939FAA', '#323539','#4A6FB1','#939FAA'], // scrollOverflow: true // sectionsColor: ['', '#939FAA', '#fff','#fff','','#fff','',''], anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', '5thpage','6thpage','7thpage','8thpage'], menu: '#menu', css3: true, scrollingSpeed: 1000, scrollOverflow: true, fixedElements: '10', // paddingTop: '3em', lockAnchors: true, // scrollBar:true, onLeave: function(){ } }); }); </script> </body> </html>
If you want to keep the revision as little as possible, try to prefix the window to external library (use as global variable) jQuery("#wowslider-container1").wowSlider(...) to window.jQuery("#wowslider-container1").wowSlider(...) Here is explanation on CRA doc. The part I could not understand is that why you need the function function ws_glass_parallax(d,l,m){...} in your script.js. But I cannot make sure it would work as expected cause that I think this is not the anticipated way to develop in react. My suggestion, including the fullpage utilization you deployed in index.html should just move to componentDidMount() which could roughly seem as the same place as $(document).ready(function() {}) so the whole picture should be: App.js import React, { Component } from 'react'; import './App.css'; class App extends Component { componentDidMount() { window.JQuery(this.refs.fullpageEle).fullpage({...}); window.JQuery(this.refs.wow).wowSlider({...}); } render() { return ( <div className="App"> <ul id="menu"> ... </ul> <div id="fullpage" ref="fullpage" > <div className="section" id="section0"> ... </div> <div className="section" id="section1"> ... </div> <div className="section" id="section2"> <div id="wowslider-container1" ref="wow"> </div> </div> <div className="section" id="section3"> ... </div> <div className="section" id="section4"> ... </div> </div> </div>); } } export default App; Something may be new to you is ref which I add in your target element and we refer the element by it in componenetDidMount(), here is the description on official doc. And leave index.html only including external source but not JS code.
AngularJS - Does Routing Harm SEO?
I am sure there are techniques to have a better SEO approach using AngularJS features, (https://prerender.io/js-seo/angularjs-seo-get-your-site-indexed-and-to-the-top-of-the-search-results/). As an example, the source code of a project I am currently developing, returns the next: <html lang="en" data-ng-app="ByTheWayApp" data-ng-controller="general"> <head> <title>ByTheWay</title> <base href="/" /> <meta charset="utf-8" /> <!-- Fonts --> <link href="https://fonts.googleapis.com/css?family=Comfortaa:300,400,700|Courgette|Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i&subset=cyrillic,cyrillic-ext,greek,latin-ext" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="/assets/css/bytheway.css"> <link rel="stylesheet" type="text/css" ng-href="{{ templateCSS }}"> </head> <body> <app> <div class="loading"> <span>ByTheWay</span> </div> <div class="app-wrapper {{ displayClass }}" load > <header class="header h-3 fixed"> <div class="inner-wrapper"> <div class="brand wpx-7"> <a href="/"> <h1 class="title"><span>ByTheWay</span></h1> <h2 class="slogan"><span>chasing dreams worldwide</span></h2> </a> </div> <nav class="nav w-auto text-right aw-const" id="nav"> home sign in <strong>sign up</strong> </nav> </div> </header> <div class="page" data-ng-controller="page" data-ng-view> <!-- Here Go Every Page Templates using $routeProvider.when('',{}); --> </div> </div> </app> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-route.js"></script> <script type="text/javascript" src="/assets/js/bytheway.js"></script> </body> </html> . <div class="page"></div> would contain the Template .html file content, but it is not displayed when I check the source code, does the same happen when Google Spiders/Bots crawl my site ? ps. I am not using yet meta tags, such description, tags, etc, because I am yet defining relevant content to be displayed. Thank you and all the best
How to access data from JSON file though Angularjs $http get req?
15.html <html> <meta charset="utf-8"> <title>Angularjs htttp services</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"> </script> <script src="controller15.js"></script> </head> <body ng-app="mainApp"> <div ng-controller="people"> <ul> <h2> names and ages of the programmers</h2> <li ng-repeat="person in persons"> {{ person.Name +':' +person.Age}} </li> </ul> </div> </body> </html> controller15.js var app=angular.module('mainApp',[]); app.controller('people', function($scope,$http) { $http.get('database.json') .success(function(response) { $scope.person=response.records; }); }); database.json where I stored the info: { "records":[ { "Name":"mehul","Age":"13" }, { "Name":"ashok","Age":"23" }, { "Name":"rajesh","Age":"44" } ] } I have attached all of the code, please review my code. I am a beginner in angularjs; it would be always good if you suggest me a particular material or web site to go through.
First: Do not use a minified version of angular to see described errors in your browser console. then tel me what errors do you see! <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.js">
deploy project Node on VPS
i try to deploy my project on my vps. This is my server.js var http = require('http'); var fs = require('fs'); var mime = require('mime'); var filename = "./index.html"; http.createServer(function (req, res) { fs.readFile(filename, function(err, file) { if (err) { res.end("errore ci fu"); } res.writeHeader(200, { "Content-Type": require('mime').lookup(filename) }); res.write(file, 'binary'); res.end(); }); }).listen(5000); console.log('Server running at http://127.0.0.1:5000/'); and this is my structure: this is the html file: <!DOCTYPE html> <html ng-app="app"> <head> <meta charset="utf-8" /> <title>AngularJS User Registration and Login Example</title> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" /> <link href="app-content/app.css" rel="stylesheet" /> </head> <body> <div class="jumbotron"> <div class="container"> <div class="col-sm-8 col-sm-offset-2"> <div ng-class="{ 'alert': flash, 'alert-success': flash.type === 'success', 'alert-danger': flash.type === 'error' }" ng-if="flash" ng-bind="flash.message"></div> <div ng-view></div> </div> </div> </div> <div class="credits text-center"> <p> AngularJS User Registration and Login Example </p> <p> JasonWatmore.com </p> </div> <script src="//code.jquery.com/jquery-2.0.3.min.js"></script> <script src="//code.angularjs.org/1.2.20/angular.js"></script> <script src="//code.angularjs.org/1.2.20/angular-route.js"></script> <script src="//code.angularjs.org/1.2.13/angular-cookies.js"></script> <script src="app.js"></script> <script src="app-services/authentication.service.js"></script> <script src="app-services/flash.service.js"></script> <script src="app-services/user.service.local-storage.js"></script> <script src="home/home.controller.js"></script> <script src="login/login.controller.js"></script> <script src="register/register.controller.js"></script> </body> </html> When I try tu run application e I on my browser type the right address, the responce is an error because it deasn't download tha angular js and maybe also other dependencies. this is the result on my browser: Why it doesn't download the dependencies????? I ask for your help!! Thanks