我在youtube上跟隨一個教程來構建我的第一個meanstack應用程序,但是列表的標題沒有顯示出來。我是用失眠來做清單的。以下是我在Node和express后端的代碼:
const express = require('express');
const app = express();
const mongoose = require('./database/mongoose');
const List = require('./database/models/list');
const Task = require('./database/models/task');
app.use(express.json());
app.use((req, res, next)=>{
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
})
app.get('/lists', (req, res) => {
List.find({})
.then(lists => res.send(lists))
.catch((error) => console.log(error));
});
app.post('/lists', (req, res)=>{
( new List({ 'title': req.body.title }))
.save()
.then((list) => res.send(list))
.catch((error) => console.log(error));
});
app.get('/lists/:listId', (req,res) => {
List.find({ _id:req.params.listId})
.then((list) => res.send(list))
.catch((error) => console.log(error));
});
app.patch('/lists/:listId', (req,res) => {
List.findOneAndUpdate({ '_id': req.params.listId}, {$set:req.body})
.then((list) => res.send(list))
.catch((error) => console.log(error));
})
app.delete('/lists/:listId', (req,res) => {
const deleteTasks = (list)=> {
Task.deleteMany({ _listId:list._id})
.then(() => list)
.catch((error) => console.log(error));
};
List.findByIdAndDelete({ _id: req.params.listId})
.then((list) => res.send(deleteTasks(list)))
.catch((error) => console.log(error));
})
/* Tasks*/
app.get('/lists/:listId/tasks', (req,res) => {
Task.find({ _listId: req.params.listId})
.then((tasks) => res.send(tasks))
.catch((error) => console.log(error));
});
app.post('/lists/:listId/tasks', (req, res)=>{
( new Task({ '_listId': req.params.listId , 'title': req.body.title}))
.save()
.then((tasks) => res.send(tasks))
.catch((error) => console.log(error));
});
app.get('/lists/:listId/tasks/:taskId', (req,res) => {
Task.findOne({ _listId: req.params.listId, _id:req.params.taskId})
.then((task) => res.send(task))
.catch((error) => console.log(error));
});
app.patch('/lists/:listId/tasks/:taskId', (req,res) => {
Task.findOneAndUpdate({ _listId: req.params.listId, _id:req.params.taskId}, {$set:req.body})
.then((task) => res.send(task))
.catch((error) => console.log(error));
})
app.delete('/lists/:listId/tasks/:taskId', (req,res) => {
Task.findByIdAndDelete({ _listId: req.params.listId, _id:req.params.taskId})
.then((task) => res.send(task))
.catch((error) => console.log(error));
})
app.listen(3000, () => console.log("Server Connected on Port 3000"));
angular服務文件是:
import { Injectable } from '@angular/core';
import{ WebService} from './web.service';
import Task from './models/task';
@Injectable({
providedIn: 'root'
})
export class TaskService {
constructor(private webService: WebService) { }
getLists(){
return this.webService.get('lists');
}
createLists(title:string){
return this.webService.post('lists', {title})
}
getTasks(listId: string){
return this.webService.get('lists/${listId}/tasks');
}
createTasks(listId: string, title:string){
return this.webService.post('lists/${listId}/tasks', {title})
}
deleteLists(listId: string){
return this.webService.delete('lists/${listId}')
}
deleteTasks(listId: string){
return this.webService.delete('lists/${listId}/tasks/${taskId}')
}
setCompleted(listId: string, task: Task){
return this.webService.patch('lists/${listId}/tasks/${task._id}', {completed: !task.completed})
}
}
and
import { Injectable } from '@angular/core';
import{HttpClient} from "@angular/common/http";
@Injectable({
providedIn: 'root'
})
export class WebService {
readonly ROOT_URL;
constructor(private http: HttpClient) {
this.ROOT_URL = "http//localhost:3000";
}
get(uri: string){
return this.http.get('${this.ROOT_URL}/${uri}');
}
post(uri: string, payload: Object){
return this.http.post('${this.ROOT_URL}/${uri}', payload);
}
patch(uri: string, payload: Object){
return this.http.patch('${this.ROOT_URL}/${uri}', payload);
}
delete(uri: string){
return this.http.delete('${this.ROOT_URL}/${uri}');
}
}
最后HTML文件是
<div class= "centered-content">
<div class= "task-manager-container">
<div class= "sidebar">
<h1 class= "title has-text-primary">Lists
</h1>
<div class= "list-menu">
<a href="#" class="list-menu-item " *ngFor="let list of lists">
<p class="white-text">
{{ list.title }}
<span class="pull-right task-delete btn-rounded-corners">X</span>
</p>
</a>
</div>
<button class="btn btn-primary btn-rounded-corners">Add Lists</button>
</div>
<div class="task-list-container">
<h1 class= "title has-text-primary">Tasks</h1>
<div class="task complete">
<p class="white-text">
Task
<span class="pull-right task-delete btn-rounded-corners">X</span>
</p>
</div>
</div>
</div>
</div>
這是task-view.component.ts文件
import { Component, OnInit } from '@angular/core';
import List from 'src/app/models/list';
import Task from 'src/app/models/task';
import { TaskService } from 'src/app/task.service';
@Component({
selector: 'app-task-view',
templateUrl: './task-view.component.html',
styleUrls: ['./task-view.component.scss']
})
export class TaskViewComponent implements OnInit {
lists: List[]= [];
task: Task[]= [];
constructor(private taskService: TaskService) { }
ngOnInit() {
this.taskService.getLists().subscribe((lists: List[]) => this.lists = lists);
}
}
它可能是不推薦使用的語法或API中缺少的部分。
在你的
TaskService
&WebService
文件中,你使用了single-quote(')。將其替換為back-ticks(`)。下面我舉一個例子:
you've used:
它應該是:
在此處了解有關模板文字的更多信息