MEAN.JS-SPA 구축 : 다음 단계
이전 장에서 Angularjs를 사용하여 단일 페이지 meanjs 애플리케이션을 만드는 것을 보았습니다. 이 장에서는 Angular 애플리케이션이 API를 사용하여 Mongodb에서 데이터를 가져 오는 방법을 살펴 보겠습니다.
이 링크 에서이 애플리케이션의 소스 코드를 다운로드 할 수 있습니다 . zip 파일을 다운로드하십시오. 시스템에서 추출하십시오.
소스 코드의 디렉토리 구조는 다음과 같습니다.
mean-demo
-app
-models
-student.js
-config
-db.js
-public
-js
-controllers
-MainCtrl.js
-StudentCtrl.js
-services
-StudentService.js
-app.js
-appRoutes.js
-views
-home.html
-student.html
-index.html
-.bowerrc
-bower.json
-package.json
-server.js
이 응용 프로그램에서는 Student 컬렉션의 모든 학생을 나열하는 뷰 (home.html)를 만들었습니다. student기록하고 학생 기록을 삭제할 수 있습니다. 이러한 모든 작업은 REST API 호출을 통해 수행됩니다.
터미널을 열고 아래 명령을 실행하여 npm 모듈 종속성을 설치하십시오.
$ npm install
다음으로 아래 명령을 사용하여 Bower 구성 요소를 설치합니다. public / libs 아래의 모든 파일에서 bower pull을 볼 수 있습니다.
$ bower install
애플리케이션의 노드 구성은 server.js 파일에 저장됩니다. 이것은 노드 앱의 기본 파일이며 전체 애플리케이션을 구성합니다.
// modules =================================================
const express = require('express');
const app = express();
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var methodOverride = require('method-override');
// set our port
const port = 3000;
// configuration ===========================================
// configure body parser
app.use(bodyParser.json()); // parse application/json
// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }));
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));
// override with the X-HTTP-Method-Override header in the request.
app.use(methodOverride('X-HTTP-Method-Override')); simulate DELETE/PUT
// set the static files location /public/img will be /img for users
app.use(express.static(__dirname + '/public'));
// config files
var db = require('./config/db');
console.log("connecting--",db);
mongoose.connect(db.url); //Mongoose connection created
// grab the student model
var Student = require('./app/models/student');
function getStudents(res) {
Student.find(function (err, students) {
// if there is an error retrieving, send the error. nothing after res.send(err) will execute
if (err) {
res.send(err);
}
res.json(students); // return all todos in JSON format
});
};
app.get('/api/studentslist', function(req, res) {
getStudents(res);
});
app.post('/api/students/send', function (req, res) {
var student = new Student(); // create a new instance of the student model
student.name = req.body.name; // set the student name (comes from the request)
student.save(function(err) {
if (err)
res.send(err);
getStudents(res);
});
});
app.delete('/api/students/:student_id', function (req, res) {
Student.remove({
_id: req.params.student_id
}, function(err, bear) {
if (err)
res.send(err);
getStudents(res);
});
});
// startup our app at http://localhost:3000
app.listen(port, () ⇒ console.log(`Example app listening on port ${port}!`));
프런트 엔드 경로 정의
공공 / index.html을 파일 코드 다음해야합니다 -
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<base href="/">
<title>Tutorialspoint Node and Angular</title>
<!-- CSS -->
<link rel="stylesheet" href="libs/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="css/style.css"> <!-- custom styles -->
<!-- JS -->
<script src="libs/angular/angular.min.js"></script>
<script src="libs/angular-route/angular-route.min.js"></script>
<!-- ANGULAR CUSTOM -->
<script src="js/controllers/MainCtrl.js"></script>
<script src="js/controllers/StudentCtrl.js"></script>
<script src="js/services/StudentService.js"></script>
<script src="js/appRoutes.js"></script>
<script src="js/app.js"></script>
</head>
<body ng-app="sampleApp" ng-controller="MainController">
<div class="container">
<!-- HEADER -->
<nav class="navbar navbar-inverse">
<div class="navbar-header">
<a class="navbar-brand" href="/">Tutorial</a>
</div>
<ul class="nav navbar-nav">
<li><a href="/students">Students</a></li>
</ul>
</nav>
<!-- ANGULAR DYNAMIC CONTENT -->
<div ng-view></div>
</div>
</body>
</html>
API 호출을하고 API 요청을 실행하는 서비스를 작성했습니다. 우리의 서비스 인 StudentService 는 아래와 같습니다.
angular.module('StudentService', [])
// super simple service
// each function returns a promise object
.factory('Student', ['$http',function($http) {
return {
get : function() {
return $http.get('/api/students');
},
create : function(student) {
return $http.post('/api/students/send', student);
},
delete : function(id) {
return $http.delete('/api/students/' + id);
}
}
}]);
컨트롤러 (MainCtrl.js) 코드는 다음과 같습니다.
angular.module('MainCtrl', []).controller('MainController',
['$scope','$http','Student',function($scope, $http, Student) {
$scope.formData = {};
$scope.loading = true;
$http.get('/api/studentslist').
then(function(response) {
$scope.student = response.data;
});
// CREATE
// when submitting the add form, send the text to the node API
$scope.createStudent = function() {
// validate the formData to make sure that something is there
// if form is empty, nothing will happen
if ($scope.formData.name != undefined) {
$scope.loading = true;
// call the create function from our service (returns a promise object)
Student.create($scope.formData)
// if successful creation, call our get function to get all the new Student
.then(function (response){
$scope.student = response.data;
$scope.loading = false;
$scope.formData = {}
}, function (error){
});
}
};
// DELETE
==================================================================
// delete a todo after checking it
$scope.deleteStudent = function(id) {
$scope.loading = true;
Student.delete(id)
// if successful delete, call our get function to get all the new Student
.then(function(response) {
$scope.loading = false;
new list of Student
});
};
}]);
응용 프로그램 실행
프로젝트 디렉토리로 이동하여 아래에 주어진 명령을 실행하십시오-
$ npm start
이제 다음으로 이동 http://localhost:3000 그러면 아래 이미지와 같이 페이지가 표시됩니다.
텍스트 상자에 텍스트를 입력하고 Add단추. 레코드가 추가되고 다음과 같이 표시됩니다.
확인란을 선택하여 레코드를 삭제할 수 있습니다.