javascript - Hur skickar man en strängparameter från Angular UI till Node.js-backend?


Jag försöker skicka ett strängvärde från Angular UI till Node.js backend-API som sedan söker i MongoDB med det passerade strängvärdet enligt nedan.

Jag försöker ta in inmatningen i enteredValue och skicka den vidare till http.get-anropet som params:this.enteredValue och till node.js som req.params. Som du kan se nedan, om jag hårdkodar strängvärdet för "orgChange" fungerar det bra, men på något sätt fungerar inte att skicka parametrar och det ger fel. Finns det någon vägledning om hur man kan åtgärda detta?

html :

<textarea rows="6" [(ngModel)]="enteredValue"></textarea>
<hr>
<button (click)="get_change_lifecycle_data()">Search</button>

<p>{{newPost | json }}</p>

komponent

import { Component, OnInit, Injectable } from '@angular/core';
import { HttpClient } from "@angular/common/http";
import { Subject } from "rxjs";
import { map } from 'rxjs/operators';

@Component({
  selector: 'app-change-input',
  templateUrl: './change-input.component.html',
  styleUrls: ['./change-input.component.css']
})


export class ChangeInputComponent  {

constructor(private http: HttpClient) {}

enteredValue : any;
newPost : any;
get_change_lifecycle_data(){
     this.http.get('http://localhost:3000/api/change_life_cycle2',{params:this.enteredValue}).subscribe(response => {
     console.log(response);
      this.newPost = response
      });
}

}

node.js

hård koda strängvärdet för "orgChange", det fungerar bra

app.get("/api/change_life_cycle", (req, res, next) => {
 Change_life_cycle.find({ orgChange: "51918661" }).then(documents => {
    res.status(200).json({
      message: "Posts fetched successfully!",
      posts: documents
    });
  });
});

API med req.params

   app.get("/api/change_life_cycle2", (req, res, next) => {
    console.log(req.body)
     Change_life_cycle.find({ orgChange: req.params }).then(documents => {
        res.status(200).json({
          message: "Posts fetched successfully!",
          posts: documents
        });
      });
    });

Fel:--

(node:75156) UnhandledPromiseRejectionWarning: CastError: Cast to string failed for value "{}" at path "orgChange" for model "change_life_cycle"
    at new CastError (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/error/cast.js:29:11)
    at SchemaString.cast (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/schema/string.js:553:11)
    at SchemaString.SchemaType.applySetters (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/schematype.js:948:12)
    at SchemaString.SchemaType._castForQuery (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/schematype.js:1362:15)
    at SchemaString.castForQuery (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/schema/string.js:609:15)
    at SchemaString.SchemaType.castForQueryWrapper (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/schematype.js:1331:15)
    at cast (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/cast.js:252:34)
    at model.Query.Query.cast (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/query.js:4576:12)
    at model.Query.Query._castConditions (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/query.js:1783:10)
    at model.Query.<anonymous> (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/query.js:1810:8)
    at model.Query._wrappedThunk [as _find] (/Users/username/Downloads/mongodb-03-finished/node_modules/mongoose/lib/helpers/query/wrapThunk.js:16:8)
    at process.nextTick (/Users/username/Downloads/mongodb-03-finished/node_modules/kareem/index.js:369:33)
    at process._tickCallback (internal/process/next_tick.js:61:11)
(node:75156) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:75156) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Svar #1

Kan du prova att använda HttpParams:

get_change_lifecycle_data(){
     const params = new HttpParams().set('params', this.enteredValue);
     this.http.get('http://localhost:3000/api/change_life_cycle2',{params})
     .subscribe(response => {
          console.log(response);
          this.newPost = response
      });
}


och i node använd req.query för att komma åt parametrar:

   app.get("/api/change_life_cycle2", (req, res, next) => {
    console.log(req.body)
     Change_life_cycle.find({ orgChange: req.query.params }).then(documents => {
        res.status(200).json({
          message: "Posts fetched successfully!",
          posts: documents
        });
      });
    });

Svar #2

Redigera: Det finns tre sätt att få parametrar att uttrycka:

  1. req.query --> detta fall, frågeparametrar
  2. req.body --> post-begärans kroppspayload
  3. req.params --> /:someParam i URL-parametrar

så jag missade det :) det borde vara req.query.searchKey.

Ändra frågan till så här: du behöver skicka olika parametrar med olika namn:

this.http.get('http://localhost:3000/api/change_life_cycle2', 
  {
    params:{
    searchKey: this.enteredValue
    }
  }).subscribe(response => {
    console.log(response);
    this.newPost = response
});

På API-sidan läser du parametrarna i förfrågan på detta sätt:

app.get("/api/change_life_cycle2", (req, res, next) => {
    console.log(req.body)
     Change_life_cycle.find({ orgChange: req.query.searchKey }).then(documents => {
        res.status(200).json({
          message: "Posts fetched successfully!",
          posts: documents
        });
      });
    });

Relaterade artiklar