0

現在、RESTAPI および GraphQL マイクロサービスの呼び出しを処理する Express Gateway に取り組んでいます。GraphQL パイプラインは正常に動作しますが、RESTAPI のパイプラインは私が苦労しているものです。

本や著者を作成、読み取り、更新、削除できるシンプルな CRUD 機能 RESTAPI を作成しました。http://localhost:4001/books/add のように、これを行うための複数のルートがあります。

問題は、これらのルートまたはパスを高速ゲートウェイで変換する方法を本当に理解していないため、ゲートウェイ経由で到達できることです。

これは私の現在のコード、config.yml です。

http:
  port: 8080
admin:
  port: 9876
  host: localhost
apiEndpoints:
  restapi:
    host: localhost
    paths: '/rp'
  graphql:
    host: localhost
    paths: '/gql'
serviceEndpoints:
  restapi:
    url: 'http://localhost:4001/'    
  graphql:  
    url: 'http://localhost:4000'
policies:
  - proxy
pipelines:
  restapi:
    apiEndpoints:
      - restapi
    policies:
      - proxy:
          - action: 
              serviceEndpoint: restapi
              changeOrigin: true
              ignorePath: false
              prependPath: true
              stripPath: true
              
  graphql:
    apiEndpoints:
      - graphql
    policies:
      - proxy:
          - action:
              serviceEndpoint: graphql
              changeOrigin: true

これはrestapiの本のコードです:

const express = require('express');
const mongoose = require('mongoose');
const book = require('../models/book');
const { findById } = require('../models/book');
const router = express.Router();
const Book = require('../models/book');

//read all books
router.get('/', async (req, res) =>{
    try{
        const AllBooks = await Book.find();
        res.json(AllBooks);
    }catch(err){
        res.json({message:err});
    }
    
})

//create book
router.post('/add', async (req, res) => {
    var NewBook = new Book({
        title: req.body.title,
        pages: req.body.pages
    })
    try{
        const SavedBook = await NewBook.save();
        res.json(SavedBook);
    }catch(err){
        res.json({message: err})
    }
})

//read book
router.get('/:BookId', async (req, res) => {
    try{
        const ReadBook = await Book.findById(req.params.BookId);
        res.json(ReadBook);
    }catch(err){
        res.json({message: err});
    }    
})

//update book
router.patch('/update/:BookId', async (req, res) => {
    try{
        const updatedBook = await Book.updateOne({_id: req.params.BookId},
            {$set: {title: req.body.title, pages: req.body.pages}});
        res.json(updatedBook);
    }catch(err){
        res.json({message: err});
    }    
})

//delete book
router.delete('/delete/:BookId', async (req, res) => {
    try{
         const DelBook = await Book.findById(req.params.BookId);
         DelBook.delete();
         res.send(DelBook + " Deleted");
    }catch(err){
        res.json({message: err});
    }
})



module.exports = router;

http://localhost:4001/rp を呼び出すと、指示どおりに「restapi」が返されます。しかし、http://localhost:4001/rp/books を呼び出すと、"CANNOT GET" が返されます。これは、このパスを定義しなかった論理的な原因です。最初は、高速ゲートウェイがこれを自動的に理解すると思っていました。

すべてのパスをハードコーディングする必要がありますか?

Express Gateway には私の場合のような例がないので、誰かがこれを説明してくれることを願っています。:)

4

1 に答える 1