{"id":3885,"date":"2017-08-15T07:00:49","date_gmt":"2017-08-15T14:00:49","guid":{"rendered":"http:\/\/www.couchbase.com\/blog\/?p=3885"},"modified":"2025-06-13T20:15:11","modified_gmt":"2025-06-14T03:15:11","slug":"bringing-user-profile-store-mobile-nativescript-angular","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/","title":{"rendered":"Trazendo seu armazenamento de perfil de usu\u00e1rio para dispositivos m\u00f3veis com NativeScript e Angular"},"content":{"rendered":"<p>Continuing down the path of user profile stores, we had previously seen <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">how to create one with Node.js and Couchbase NoSQL<\/a> as well as a <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">web client front-end for it using Angular<\/a>. What if we wanted to take this into a mobile application, which is the norm for all applications as of now.<\/p>\n<p>There are many different mobile frameworks out there and we&#8217;re lucky that some even support Angular, which is what we had used in the previous example. We&#8217;re going to see how to convert our client front-end to mobile using <a href=\"https:\/\/www.nativescript.org\" target=\"_blank\" rel=\"noopener\">NativeScript<\/a> and Angular.<\/p>\n<p><!--more--><\/p>\n<p>Before going forward, the assumption is that you&#8217;ve completely both of the two previous tutorials, one on <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">creating the profile store backend<\/a> and the other on <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">creating the profile store web front-end<\/a>. We&#8217;re also going to assume that your development environment is property configured for mobile development, whether that be Android, iOS, or both.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3887 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/07\/ns-angular-profile-store.gif\" alt=\"NativeScript with Couchbase Profile Store\" width=\"1100\" height=\"709\" \/><\/p>\n<p>The flow of events in this application will match what we saw in the web version.<\/p>\n<h2>Create a New NativeScript with Angular Project<\/h2>\n<p>Assuming that you&#8217;ve gotten the NativeScript CLI installed and configured, execute the following to create a new project:<\/p>\n<pre class=\"lang:default decode:true \">tns create profile-project-ns --ng<\/pre>\n<p>The <code>--ng<\/code> flag in the above command is important because it means we are creating an Angular project rather than a NativeScript Core project.<\/p>\n<p>As of right now, the NativeScript CLI doesn&#8217;t share the Angular CLI capabilities of generating components. For this reason, we&#8217;re going to have to create each of the HTML and TypeScript files manually.<\/p>\n<p>If you&#8217;re on Mac or Linux, execute the following from within the NativeScript project:<\/p>\n<pre class=\"lang:default decode:true \">mkdir -p app\/login\r\nmkdir -p app\/register\r\nmkdir -p app\/blogs\r\nmkdir -p app\/blog\r\ntouch app\/login\/login.component.html\r\ntouch app\/login\/login.component.ts\r\ntouch app\/register\/register.component.html\r\ntouch app\/register\/register.component.ts\r\ntouch app\/blogs\/blogs.component.html\r\ntouch app\/blogs\/blogs.component.ts\r\ntouch app\/blog\/blog.component.html\r\ntouch app\/blog\/blog.component.ts<\/pre>\n<p>If you&#8217;re on Windows, just create those directories and files manually. If you really wanted to, you could copy these directories and files from your web project from the <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">previous tutorial<\/a>.<\/p>\n<h2>Defining the Components to Represent Each Screen<\/h2>\n<p>Starting in the same direction as the web version, we&#8217;re going to focus on user login. Open the project&#8217;s\u00a0<strong>app\/login\/login.component.ts<\/strong> file and include the following code:<\/p>\n<pre class=\"lang:default decode:true \">import { Component } from '@angular\/core';\r\nimport { Http, Headers, RequestOptions } from \"@angular\/http\";\r\nimport { Router } from \"@angular\/router\";\r\nimport \"rxjs\/Rx\";\r\n\r\n@Component({\r\n    moduleId: module.id,\r\n    selector: 'app-login',\r\n    templateUrl: '.\/login.component.html'\r\n})\r\nexport class LoginComponent {\r\n\r\n    public input: any;\r\n\r\n    constructor(private http: Http, private router: Router) {\r\n        this.input = {\r\n            \"email\": \"\",\r\n            \"password\": \"\"\r\n        };\r\n    }\r\n\r\n    public login() {\r\n        if(this.input.email &amp;&amp; this.input.password) {\r\n            let headers = new Headers({ \"content-type\": \"application\/json\" });\r\n            let options = new RequestOptions({ headers: headers });\r\n            this.http.post(\"https:\/\/localhost:3000\/login\", JSON.stringify(this.input), options)\r\n                .map(result =&gt; result.json())\r\n                .subscribe(result =&gt; {\r\n                    this.router.navigate([\"\/blogs\"], { \"queryParams\": result });\r\n                });\r\n        }\r\n    }\r\n\r\n}<\/pre>\n<p>The above code is exactly what we saw in the web version with two exceptions. I&#8217;ve removed the CSS reference since we did not create a CSS file on a component basis. I&#8217;ve also added a <code>moduleId<\/code> so relative paths could work with our component. These are both Angular related items with nothing to do with NativeScript.<\/p>\n<p>The HTML is where things are different. Open the project&#8217;s\u00a0<strong>app\/login\/login.component.html<\/strong> file and include the following XML markup:<\/p>\n<pre class=\"lang:default decode:true \">&lt;ActionBar title=\"{N} Profile Store\"&gt;&lt;\/ActionBar&gt;\r\n&lt;StackLayout class=\"form\"&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Email\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" [(ngModel)]=\"input.email\" autocapitalizationType=\"none\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Password\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" secure=\"true\" [(ngModel)]=\"input.password\" autocapitalizationType=\"none\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Button class=\"btn btn-primary\" text=\"Login\" (tap)=\"login()\"&gt;&lt;\/Button&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Register here.\" [nsRouterLink]=\"['\/register']\" class=\"text-center\"&gt;&lt;\/Label&gt;\r\n    &lt;\/StackLayout&gt;\r\n&lt;\/StackLayout&gt;<\/pre>\n<p>NativeScript has its own markup for the UI. The same rules apply in terms of Angular, but creating UI components is just a bit different.<\/p>\n<p>For example, we are still using the <code>[(ngModel)]<\/code> attributes, but instead of <code>div<\/code> tags, we have <code>StackLayout<\/code> tags.<\/p>\n<p>Now let&#8217;s take a look at the registration component. Open the project&#8217;s\u00a0<strong>app\/register\/register.component.ts<\/strong> file and include the following TypeScript:<\/p>\n<pre class=\"lang:default decode:true \">import { Component } from '@angular\/core';\r\nimport { Http, Headers, RequestOptions } from \"@angular\/http\";\r\nimport { Router } from \"@angular\/router\";\r\nimport \"rxjs\/Rx\";\r\n\r\n@Component({\r\n    moduleId: module.id,\r\n    selector: 'app-register',\r\n    templateUrl: '.\/register.component.html'\r\n})\r\nexport class RegisterComponent {\r\n\r\n    public input: any;\r\n\r\n    public constructor(private http: Http, private router: Router) {\r\n        this.input = {\r\n            \"firstname\": \"\",\r\n            \"lastname\": \"\",\r\n            \"email\": \"\",\r\n            \"password\": \"\"\r\n        };\r\n    }\r\n\r\n    public register() {\r\n        if(this.input.email &amp;&amp; this.input.password) {\r\n            let headers = new Headers({ \"content-type\": \"application\/json\" });\r\n            let options = new RequestOptions({ headers: headers });\r\n            this.http.post(\"https:\/\/localhost:3000\/account\", JSON.stringify(this.input), options)\r\n                .map(result =&gt; result.json())\r\n                .subscribe(result =&gt; {\r\n                    this.router.navigate([\"\/login\"]);\r\n                });\r\n        }\r\n    }\r\n\r\n}<\/pre>\n<p>Again, the only changes we made in the above code, compared to the previous example, is in the CSS removal and <code>moduleId<\/code> addition.<\/p>\n<p>Not bad when it comes to creating cross platform web and mobile applications right?<\/p>\n<p>The HTML for the UI that powers the TypeScript logic is found in the\u00a0<strong>app\/register\/register.component.html<\/strong> file and it looks like this:<\/p>\n<pre class=\"lang:default decode:true \">&lt;ActionBar title=\"{N} Profile Store\"&gt;&lt;\/ActionBar&gt;\r\n&lt;StackLayout class=\"form\"&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"First Name\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" [(ngModel)]=\"input.firstname\" autocapitalizationType=\"none\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Last Name\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" [(ngModel)]=\"input.lastname\" autocapitalizationType=\"none\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Email\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" [(ngModel)]=\"input.email\" autocapitalizationType=\"none\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Password\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" secure=\"true\" [(ngModel)]=\"input.password\" autocapitalizationType=\"none\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Button class=\"btn btn-primary\" text=\"Register\" (tap)=\"register()\"&gt;&lt;\/Button&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Login here.\" [nsRouterLink]=\"['\/login']\" class=\"text-center\"&gt;&lt;\/Label&gt;\r\n    &lt;\/StackLayout&gt;\r\n&lt;\/StackLayout&gt;<\/pre>\n<p>The final two components are going to be no different from what we&#8217;re already experiencing.<\/p>\n<p>Open the project&#8217;s\u00a0<strong>app\/blogs\/blogs.component.ts<\/strong> file and include the following TypeScript code:<\/p>\n<pre class=\"lang:default decode:true \">import { Component, OnInit } from '@angular\/core';\r\nimport { Http, Headers, RequestOptions } from \"@angular\/http\";\r\nimport { Router, ActivatedRoute } from \"@angular\/router\";\r\nimport { Location } from \"@angular\/common\";\r\nimport \"rxjs\/Rx\";\r\n\r\n@Component({\r\n    moduleId: module.id,\r\n    selector: 'app-blogs',\r\n    templateUrl: '.\/blogs.component.html'\r\n})\r\nexport class BlogsComponent implements OnInit {\r\n\r\n    private sid: string;\r\n    public entries: Array&lt;any&gt;;\r\n\r\n    public constructor(private http: Http, private router: Router, private route: ActivatedRoute, private location: Location) {\r\n        this.entries = [];\r\n    }\r\n\r\n    public ngOnInit() {\r\n        this.location.subscribe(() =&gt; {\r\n            let headers = new Headers({ \"authorization\": \"Bearer \" + this.sid });\r\n            let options = new RequestOptions({ headers: headers });\r\n            this.http.get(\"https:\/\/localhost:3000\/blogs\", options)\r\n                .map(result =&gt; result.json())\r\n                .subscribe(result =&gt; {\r\n                    this.entries = result;\r\n                });\r\n        });\r\n        this.route.queryParams.subscribe(params =&gt; {\r\n            this.sid = params[\"sid\"];\r\n            let headers = new Headers({ \"authorization\": \"Bearer \" + params[\"sid\"] });\r\n            let options = new RequestOptions({ headers: headers });\r\n            this.http.get(\"https:\/\/localhost:3000\/blogs\", options)\r\n                .map(result =&gt; result.json())\r\n                .subscribe(result =&gt; {\r\n                    this.entries = result;\r\n                });\r\n        });\r\n    }\r\n\r\n    public create() {\r\n        this.router.navigate([\"\/blog\"], { \"queryParams\": { \"sid\": this.sid } });\r\n    }\r\n\r\n}<\/pre>\n<p>No changes to see in the above other than the two previously mentioned, so we can move into our HTML for the page.<\/p>\n<p>Open the project&#8217;s\u00a0<strong>app\/blogs\/blogs.component.html<\/strong> file and include the following HTML markup:<\/p>\n<pre class=\"lang:default decode:true \">&lt;ActionBar title=\"{N} Profile Store\"&gt;\r\n    &lt;ActionItem text=\"New\" ios.position=\"right\" (tap)=\"create()\"&gt;&lt;\/ActionItem&gt;\r\n    &lt;NavigationButton text=\"Back\"&gt;&lt;\/NavigationButton&gt;\r\n&lt;\/ActionBar&gt;\r\n&lt;GridLayout rows=\"*, auto\" columns=\"*\"&gt;\r\n    &lt;ListView [items]=\"entries\" class=\"list-group\" row=\"0\" col=\"0\"&gt;\r\n        &lt;ng-template let-entry=\"item\"&gt;\r\n            &lt;StackLayout class=\"list-group-item\"&gt;\r\n                &lt;Label text=\"{{ entry.title }}\" class=\"h2\"&gt;&lt;\/Label&gt;\r\n                &lt;Label text=\"{{ entry.content }}\"&gt;&lt;\/Label&gt;\r\n            &lt;\/StackLayout&gt;\r\n        &lt;\/ng-template&gt;\r\n    &lt;\/ListView&gt;\r\n    &lt;StackLayout row=\"1\" col=\"0\" padding=\"10\" backgroundColor=\"#F0F0F0\"&gt;\r\n        &lt;Label text=\"Logout\" [nsRouterLink]=\"['\/login']\"&gt;&lt;\/Label&gt;\r\n    &lt;\/StackLayout&gt;\r\n&lt;\/GridLayout&gt;<\/pre>\n<p>Let&#8217;s wrap this application up with the final component that our profile store API and web front-end has to offer.<\/p>\n<p>Open the project&#8217;s\u00a0<strong>app\/blog\/blog.component.ts<\/strong> file and include this:<\/p>\n<pre class=\"lang:default decode:true \">import { Component, OnInit } from '@angular\/core';\r\nimport { Http, Headers, RequestOptions } from \"@angular\/http\";\r\nimport { ActivatedRoute } from \"@angular\/router\";\r\nimport { Location } from \"@angular\/common\";\r\nimport \"rxjs\/Rx\";\r\n\r\n@Component({\r\n    moduleId: module.id,\r\n    selector: 'app-blog',\r\n    templateUrl: '.\/blog.component.html'\r\n})\r\nexport class BlogComponent implements OnInit {\r\n\r\n    private sid: string;\r\n    public input: any;\r\n\r\n    public constructor(private http: Http, private route: ActivatedRoute, private location: Location) {\r\n        this.input = {\r\n            \"title\": \"\",\r\n            \"content\": \"\"\r\n        };\r\n    }\r\n\r\n    public ngOnInit() {\r\n        this.route.queryParams.subscribe(params =&gt; {\r\n            this.sid = params[\"sid\"];\r\n        });\r\n    }\r\n\r\n    public save() {\r\n        if(this.input.title &amp;&amp; this.input.content) {\r\n            let headers = new Headers({\r\n                \"content-type\": \"application\/json\",\r\n                \"authorization\": \"Bearer \" + this.sid\r\n            });\r\n            let options = new RequestOptions({ headers: headers });\r\n            this.http.post(\"https:\/\/localhost:3000\/blog\", JSON.stringify(this.input), options)\r\n                .map(result =&gt; result.json())\r\n                .subscribe(result =&gt; {\r\n                    this.location.back();\r\n                });\r\n        }\r\n    }\r\n\r\n}<\/pre>\n<p>If you didn&#8217;t copy over your CSS file, don&#8217;t forget to remove it from the <code>@Component<\/code> block as seen in the previous components.<\/p>\n<p>The HTML UI to go with this TypeScript is found in the project&#8217;s\u00a0<strong>app\/blog\/blog.component.html<\/strong> file and it looks like the following:<\/p>\n<pre class=\"lang:default decode:true \">&lt;ActionBar title=\"{N} Profile Store\"&gt;\r\n    &lt;NavigationButton text=\"Back\"&gt;&lt;\/NavigationButton&gt;\r\n&lt;\/ActionBar&gt;\r\n&lt;StackLayout class=\"form\"&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Title\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" [(ngModel)]=\"input.title\" autocapitalizationType=\"none\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Content\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextView class=\"input\" [(ngModel)]=\"input.content\" autocapitalizationType=\"none\"&gt;&lt;\/TextView&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Button class=\"btn btn-primary\" text=\"Save\" (tap)=\"save()\"&gt;&lt;\/Button&gt;\r\n    &lt;\/StackLayout&gt;\r\n&lt;\/StackLayout&gt;<\/pre>\n<p>As of right now you may be scratching your head on all this NativeScript XML markup. How Angular works with the UI hasn&#8217;t changed, but if you&#8217;re interested in learning about the NativeScript markup, check out their <a href=\"https:\/\/docs.nativescript.org\/angular\/start\/introduction.html\" target=\"_blank\" rel=\"noopener\">official documentation<\/a>. Get familiar with the <code>StackLayout<\/code>, <code>GridLayout<\/code> and individual UI component tags.<\/p>\n<h2>Bringing it Together<\/h2>\n<p>We&#8217;ve created all these Angular components for NativeScript, but we haven&#8217;t brought them together via the Angular Router.<\/p>\n<p>In the web version of this guide, the route information was in the\u00a0<strong>app.module.ts<\/strong> file. While we could do that, NativeScript broke it out into a separate file.<\/p>\n<p>Open the project&#8217;s\u00a0<strong>app\/app.routing.ts<\/strong> file and include the following:<\/p>\n<pre class=\"lang:default decode:true \">import { NgModule } from \"@angular\/core\";\r\nimport { NativeScriptRouterModule } from \"nativescript-angular\/router\";\r\nimport { Routes } from \"@angular\/router\";\r\n\r\nimport { LoginComponent } from \".\/login\/login.component\";\r\nimport { RegisterComponent } from \".\/register\/register.component\";\r\nimport { BlogsComponent } from \".\/blogs\/blogs.component\";\r\nimport { BlogComponent } from \".\/blog\/blog.component\";\r\n\r\nconst routes: Routes = [\r\n    { path: \"\", redirectTo: \"\/login\", pathMatch: \"full\" },\r\n    { path: \"login\", component: LoginComponent },\r\n    { path: \"register\", component: RegisterComponent },\r\n    { path: \"blogs\", component: BlogsComponent },\r\n    { path: \"blog\", component: BlogComponent }\r\n];\r\n\r\n@NgModule({\r\n    imports: [NativeScriptRouterModule.forRoot(routes)],\r\n    exports: [NativeScriptRouterModule]\r\n})\r\nexport class AppRoutingModule { }<\/pre>\n<p>A lot of the above code came with our new project template. We imported each of our components, and created a route for them.<\/p>\n<p>Likewise, the components need to be imported in the project&#8217;s\u00a0<strong>app\/app.module.ts<\/strong> file. Open this file and include the following:<\/p>\n<pre class=\"lang:default decode:true \">import { NgModule, NO_ERRORS_SCHEMA } from \"@angular\/core\";\r\nimport { NativeScriptModule } from \"nativescript-angular\/nativescript.module\";\r\nimport { AppRoutingModule } from \".\/app.routing\";\r\nimport { NativeScriptHttpModule } from \"nativescript-angular\/http\";\r\nimport { NativeScriptFormsModule } from \"nativescript-angular\/forms\";\r\nimport { AppComponent } from \".\/app.component\";\r\n\r\nimport { LoginComponent } from \".\/login\/login.component\";\r\nimport { RegisterComponent } from \".\/register\/register.component\";\r\nimport { BlogsComponent } from \".\/blogs\/blogs.component\";\r\nimport { BlogComponent } from \".\/blog\/blog.component\";\r\n\r\n@NgModule({\r\n    bootstrap: [\r\n        AppComponent\r\n    ],\r\n    imports: [\r\n        NativeScriptModule,\r\n        AppRoutingModule,\r\n        NativeScriptHttpModule,\r\n        NativeScriptFormsModule\r\n    ],\r\n    declarations: [\r\n        AppComponent,\r\n        LoginComponent,\r\n        RegisterComponent,\r\n        BlogsComponent,\r\n        BlogComponent\r\n    ],\r\n    providers: [],\r\n    schemas: [\r\n        NO_ERRORS_SCHEMA\r\n    ]\r\n})\r\nexport class AppModule { }<\/pre>\n<p>In addition to importing each component and adding them to the <code>declarations<\/code> array, we also imported a few modules such as the <code>NativeScriptHttpModule<\/code> and <code>NativeScriptFormsModule<\/code>. In pure Angular, these are called the <code>HttpModule<\/code> and <code>FormsModule<\/code>.<\/p>\n<p>In theory, the application is ready to go.<\/p>\n<h2>Resolving App Transport Security Issues (ATS) for iOS<\/h2>\n<p>Because the Node.js and Couchbase API is running locally, we are using HTTP rather than HTTPS. iOS will throw errors if we try to access HTTP resources.<\/p>\n<p>This is easily fixable by adding an ATS policy.<\/p>\n<p>Open the project&#8217;s\u00a0<strong>app\/App_Resources\/iOS\/Info.plist<\/strong> and add the following alongside the other XML:<\/p>\n<pre class=\"lang:default decode:true \">&lt;dict&gt;\r\n    &lt;key&gt;NSAllowsArbitraryLoads&lt;\/key&gt;\r\n    &lt;true \/&gt;\r\n&lt;\/dict&gt;<\/pre>\n<p>The above essentially whitelists all HTTP endpoints. It is not safe for production, but safe for testing.<\/p>\n<p>More information on ATS in NativeScript applications can be read about in a previous article I wrote titled,\u00a0<a href=\"https:\/\/www.thepolyglotdeveloper.com\/2015\/12\/fix-ios-9-app-transport-security-issues-in-nativescript\/\" target=\"_blank\" rel=\"noopener\">Fix iOS 9 App Transport Security Issues in NativeScript<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>You just saw how easy it was to take your web client front-end and convert it to mobile using NativeScript and Angular. The user profile store example quickly became a full stack example using the JavaScript stack. We had a Node.js with <a href=\"https:\/\/www.couchbase.com\" target=\"_blank\" rel=\"noopener\">Couchbase Server<\/a> backend, Angular web front-end, and NativeScript mobile front-end.<\/p>\n<p>The next step, or option, would be to use the Couchbase Mobile components rather than HTTP calls against the API.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Continuing down the path of user profile stores, we had previously seen how to create one with Node.js and Couchbase NoSQL as well as a web client front-end for it using Angular. What if we wanted to take this into [&hellip;]<\/p>\n","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1816,9327],"tags":[1704,2021,1543,1589,2019,1718],"ppma_author":[9032],"class_list":["post-3885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-javascript","tag-angular","tag-front-end","tag-javascript","tag-nativescript","tag-profile-store","tag-typescript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bringing Your User Profile Store to Mobile with NativeScript and Angular<\/title>\n<meta name=\"description\" content=\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\" \/>\n<meta property=\"og:description\" content=\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-15T14:00:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:15:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/07\/ns-angular-profile-store.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"1100\" \/>\n\t<meta property=\"og:image:height\" content=\"709\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\",\"datePublished\":\"2017-08-15T14:00:49+00:00\",\"dateModified\":\"2025-06-14T03:15:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"},\"wordCount\":1094,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Angular\",\"front-end\",\"javascript\",\"nativescript\",\"profile store\",\"TypeScript\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"JavaScript\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\",\"name\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-08-15T14:00:49+00:00\",\"dateModified\":\"2025-06-14T03:15:11+00:00\",\"description\":\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\\\/\\\/www.thepolyglotdeveloper.com\",\"https:\\\/\\\/www.facebook.com\\\/thepolyglotdeveloper\",\"https:\\\/\\\/x.com\\\/nraboy\"],\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/author\\\/nic-raboy-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Trazendo seu armazenamento de perfil de usu\u00e1rio para dispositivos m\u00f3veis com NativeScript e Angular","description":"Saiba como pegar o exemplo da loja de perfil de usu\u00e1rio visto nos tutoriais anteriores e criar um front-end m\u00f3vel para ele usando NativeScript e Angular.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/","og_locale":"pt_BR","og_type":"article","og_title":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","og_description":"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-08-15T14:00:49+00:00","article_modified_time":"2025-06-14T03:15:11+00:00","og_image":[{"width":1100,"height":709,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/07\/ns-angular-profile-store.gif","type":"image\/gif"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","datePublished":"2017-08-15T14:00:49+00:00","dateModified":"2025-06-14T03:15:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/"},"wordCount":1094,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Angular","front-end","javascript","nativescript","profile store","TypeScript"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","JavaScript"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/","url":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/","name":"Trazendo seu armazenamento de perfil de usu\u00e1rio para dispositivos m\u00f3veis com NativeScript e Angular","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-08-15T14:00:49+00:00","dateModified":"2025-06-14T03:15:11+00:00","description":"Saiba como pegar o exemplo da loja de perfil de usu\u00e1rio visto nos tutoriais anteriores e criar um front-end m\u00f3vel para ele usando NativeScript e Angular.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bringing Your User Profile Store to Mobile with NativeScript and Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, defensor dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/"}]}},"acf":[],"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=3885"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=3885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=3885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=3885"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=3885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}