Skip to content

Determine the data you want to get from your client just like GraphQL with easy to plug express middleware!

License

Notifications You must be signed in to change notification settings

ShaharEli/requestFieldsSelector

Repository files navigation

Contributors Forks Stargazers Issues MIT License


Logo

Request fields selector

Determine the data you want to get from your client just like GraphQL with easy to plug express middleware!

View Examples · Report Bug · Request Feature

Table of Contents
  1. About The Project
  2. Motivation
  3. Installation
  4. Usage
  5. Roadmap
  6. Contributing
  7. License
  8. Contact
  9. Acknowledgements

About The Project

The requestFieldsSelectorMiddleware provide an easy way to pick the fields of the response you send from the api in your client! just like GraphQl and even with the same syntax. The middleware improve your api by reducing over-fetching and less data transportation. Designed to use in any express api.

Motivation

I was getting sick of making many if else statements to reduce the data transportation from my api to my client and GraphQl doesn't always fit in the project type so I wanted to make an easy way to improve all my servers with the advantages of GraphQl.

Installation

npm install request-fields-selector

Usage

For more examples, please refer to the Project`s tests and Example server

  • First add the request-fields-selector middleware to your server above all the crud routes:
import requestFieldsSelectorMiddleware from 'request-fields-selector'

const app = express()

app.use(express.json())
app.use(requestFieldsSelectorMiddleware)
// You can add config object
 app.use((...args) => requestFieldsSelectorMiddleware(...args,
 {
  silent: true //no error logs
  dataNestedField: "data" // e.g your response look like this {data:"your data",status:"ok",...} the value that will be transformed will be data
  fieldSelectorName: "customFieldsName" // the default fields will be taken from your req.query or req.body and called "fields"
 }
 ))
  • Then in your client:
const API_URL = "http://happy";
const data = await fetch(`${API_URL}?fields=
{
  book {
    author
  }
}`);

//or as one liner
const data = await fetch(`${API_URL}?fields={book{author}}`);
//in the post method:
const fields = `
{
 book{
   id
   author{
     firstName
   }
 }
`;
const data = await fetch({
  method: "POST",
  body: JSON.stringify({ ...body, fields }),
});
  • Then in your api routes:
app.get("/", (req: Request, res: Response) => {
  const { transform } = req; // the middleware will provide transform function that will match the client fields to the data you about to send - if error happen it will send the whole data
  res.json(transform(data));
});

Roadmap

See the open issues for a list of proposed features (and known issues).

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Follow the commits and linting guides (conventional commits and eslint)
  6. Open a Pull Request
  7. Make sure that the pull request passed all the workflows

License

Distributed under the MIT License. See LICENSE for more information.

Contact

Shahar Eliyahu - mail

Project Link: https://github.com/ShaharEli/requestFieldsSelector

Acknowledgements

About

Determine the data you want to get from your client just like GraphQL with easy to plug express middleware!

Resources

License

Stars

Watchers

Forks

Packages

No packages published