【问题标题】:How does my https.post function know which function to call from API我的 https.post 函数如何知道从 API 调用哪个函数
【发布时间】:2019-09-06 14:19:53
【问题描述】:

我的服务文件,它从 mongoDB 发送/获取数据:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { filter, isEmpty, map } from 'rxjs/operators';
import { Employee } from './employee';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DataService {
  constructor(private http: HttpClient) { }
  uri = 'http://localhost:4000/employees';
  data: Employee[];

  addEmployee(empObj) {
    this.http.post(`${this.uri}`, empObj).subscribe(res => { console.log('Done') })
    alert('Done adding data');
  }

  getEmployees(): Observable<Object> {

    return this.http.get(`${this.uri}`)
  }
  getEmployee(id: number): any {
    return this.http.get('https://api.myjson.com/bins/mpg19')
  }
  deleteEmployee(id: number) {
    console.log('ID of employee to be deleted', id);
    return this.http.get(`${this.uri}/delete/${id}`);
  }
}

这是我执行 CRUD 操作的文件。

const express = require('express');
const app = express();
const employeeRoute = express.Router();

let Employees = require('../models/Employee');


employeeRoute.route('/').post(function (req, res) {
    console.log('coming here', req.body)
    let employee = new Employees(req.body);
    console.log('data to save is: ', employee)
    employee.save().then(employee => { res.status(200).json({ 'employee': 'Employee added in successfully' }) })
})


employeeRoute.route('/').get(function (req, res) {
    console.log('Employees Fetched');
    let employees = [];
    Employees.find({}, function (err, results) {
        if (err) {
            console.log(err);
        }
        else {
            employees = results;
            res.json(employees);
        }
    })
})

employeeRoute.route('/delete/:id').get(function (req, res) {
    console.log('Delete Function Called')
    Employees.findByIdAndRemove({ id: req.params.id }), function (err, Employees) {
        console.log('Id against which employee is deleted: ', id);
        if (err) res.json(err);
        else res.json('Successfully removed');
    }
});
module.exports = employeeRoute

我的应用程序正在正确地获取和获取数据,因为我正在按照书面教程进行操作,但我对代码的理解有些困惑。那就是: 我的addEmployee(empObj) 函数(在第一个文件中)如何知道从 CRUD 文件中调用哪个函数。 谢谢提前。

【问题讨论】:

  • 阅读更多关于 REST 模式的信息,实践将一目了然
  • 我已经用谷歌搜索过了,但仍然感到困惑,这就是为什么在这里发布。如果您有任何用于上述目的的有用资源,请给我一个链接
  • 技术上 GET 在这个 url localhost:4000/employees 应该给你一个列表 在这个 url 上的 POST 应该添加一个员工,这就是你的第二个文件的定义。 localhost:4000/employees/:id 上的 GET 应该返回单个员工,localhost:4000/employees/:id 上的 PATCH 或 PUT 应该更新员工的详细信息,localhost:4000/employees/:Id 上的 DELETE 应该从数据库中删除员工在您的情况下,您正在为 GET 请求选择 DELETE 的自定义路由这太可怕了。希望这是有道理的
  • 是的,我的删除功能不起作用。即使我现在使用delete http 方法,我应该怎么做才能使其工作
  • 错误是什么?

标签: node.js angular mongodb express


【解决方案1】:

这里有几件事您需要更加熟悉。

HTTP 服务器与 HTTP 客户端

您的 HTTP 客户端负责向服务器发送 HTTP(s) 请求。当它分派这个请求时,它通常无法知道服务器是否 a) 将接受请求,或者 b) 服务器将如何处理请求。因此,当您调用http.post() 时,您的 HTTP 客户端不知道您的服务器将如何处理该请求。您可以将其视为您的 http 客户端向服务器发送的带有一些说明和详细信息的消息。

您的 HTTP 服务器负责接受、验证和路由传入请求以及响应这些请求。只有您的服务器知道它想如何处理传入的请求,以及它会接受还是拒绝它们(或者至少应该是这样的。)

您可以在此处详细了解 HTTP 的工作原理: https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview

休息

正如您的 HTTP 客户端无法知道您的服务器将如何处理特定的 HTTP 请求一样,您(开发人员)也无法轻松地对您的 HTTP 服务器进行推理,并且所有这些都是潜在的有价值的数据.正是出于这个原因,REST 旨在建立一套围绕互联网上的结构化内容(或resources)设计的原则,以合理的方式描述这些资源,并以简单的方式使用常见的英语动词(GET、PUT、删除、发布等...)。

您可以在此处阅读有关 REST 的更多信息(并找到相关链接):https://developer.mozilla.org/en-US/docs/Glossary/REST

快速路由

Express 充当 HTTP 服务器上的软件路由层。重要的是要理解这意味着 express 负责在您的服务器上创建和注册指向资源的虚拟路由。例如,当您执行以下操作时:http.post('http://myserver.com/api/employees'); 您实际上是在要求 express(在此示例中)尝试使用 'api/employees' 的路由路径查找已注册的路由,并在适当的情况下使用资源(或多个资源)进行响应。

因此,直接回答您的问题 - Angular 的 HTTP 客户端不知道哪个函数将在您的 Express HTTP 服务器上运行。您的 Express Server 使用路由 http://localhost:4000/employees 来确定您要求的资源类型。在这种情况下,它会查找注册到“员工”的路由并验证该路由是否接受 POST。如果它确实接受 POST,那么它会执行与该注册路由关联的回调。

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 2011-03-21
    • 2014-07-10
    • 2012-07-02
    • 2021-08-07
    • 2016-01-20
    • 2013-05-08
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多