我如何通过我的 REST API 在 Express Gateway 中使用多个路径和端点?
How do i use multiple paths and endpoints in Express Gateway with my RESTAPI?
目前正在处理 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 时,它 return“restapi”就像我告诉的那样。
但是当我调用:http://localhost:4001/rp/books 时,它 return 是一个“CANNOT GET”,这是合乎逻辑的,因为我没有定义这条路径。首先我以为快速网关会自动理解这一点。
我是否必须对所有路径进行硬编码?
我希望有人能给我解释一下,因为 express gateway 没有像我这样的例子。 :)
我找到了解决方案。
我对 apiEndpoint 和 serviceEndpoint 之间的定义感到困惑。
答案是:是的,您必须对其中的所有路径进行硬编码,但这只会在“api端点”下。
它看起来像这样:
apiEndpoints:
restapi:
host: localhost
paths:
- '/books'
- '/books/add'
- '/authors'
- '/authors/...'
serviceEndpoints:
restapi:
url: 'http://localhost:4001'
总而言之,只有一项服务具有多个 api 个端点,这听起来很合乎逻辑。
我认为一个缺点是,当有很多服务时,这个配置文件会变成一大堆端点。
目前正在处理 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 时,它 return“restapi”就像我告诉的那样。 但是当我调用:http://localhost:4001/rp/books 时,它 return 是一个“CANNOT GET”,这是合乎逻辑的,因为我没有定义这条路径。首先我以为快速网关会自动理解这一点。
我是否必须对所有路径进行硬编码?
我希望有人能给我解释一下,因为 express gateway 没有像我这样的例子。 :)
我找到了解决方案。
我对 apiEndpoint 和 serviceEndpoint 之间的定义感到困惑。
答案是:是的,您必须对其中的所有路径进行硬编码,但这只会在“api端点”下。
它看起来像这样:
apiEndpoints:
restapi:
host: localhost
paths:
- '/books'
- '/books/add'
- '/authors'
- '/authors/...'
serviceEndpoints:
restapi:
url: 'http://localhost:4001'
总而言之,只有一项服务具有多个 api 个端点,这听起来很合乎逻辑。
我认为一个缺点是,当有很多服务时,这个配置文件会变成一大堆端点。