@misterzik/espressojs
Version:
EspressoJS Introducing Espresso.JS, your ultimate Express configuration starting point and boilerplate. With its simplicity and lack of opinionation, EspressoJS offers plug-and-play configurations built on top of Express.
150 lines (126 loc) • 3.94 kB
JavaScript
/*
* EspressoJS - Multiple API Endpoints Example
* This example demonstrates how to use multiple API configurations
*/
const express = require('express');
const router = express.Router();
const { asyncHandler, AppError } = require('../server/middleware/errorHandler');
const { apiManager } = require('../index');
// Example 1: Using the API Manager directly
router.get('/news', asyncHandler(async (req, res) => {
// Make a request to api2 endpoint
const newsData = await apiManager.request('api2', '');
res.status(200).json({
status: 'success',
source: 'api2',
data: newsData
});
}));
// Example 2: Using multiple APIs in a single endpoint
router.get('/combined-data', asyncHandler(async (req, res) => {
// Check which APIs are available
const availableAPIs = apiManager.getAllAPIs();
// Make parallel requests to multiple APIs
const results = await Promise.allSettled([
apiManager.request('api', '/endpoint1'),
apiManager.request('api2', ''),
apiManager.request('api3', '/data')
]);
const data = {
api1: results[0].status === 'fulfilled' ? results[0].value : null,
api2: results[1].status === 'fulfilled' ? results[1].value : null,
api3: results[2].status === 'fulfilled' ? results[2].value : null,
};
res.status(200).json({
status: 'success',
availableAPIs: Object.keys(availableAPIs),
data
});
}));
// Example 3: Using specific API with custom options
router.get('/custom-request', asyncHandler(async (req, res) => {
const data = await apiManager.request('api3', '/custom-endpoint', {
method: 'POST',
data: { query: 'example' },
headers: {
'Custom-Header': 'value'
},
timeout: 5000,
retries: 2
});
res.status(200).json({
status: 'success',
data
});
}));
// Example 4: Creating a custom Axios instance for an API
router.get('/axios-instance', asyncHandler(async (req, res) => {
// Create a custom axios instance for api2
const api2Client = apiManager.createAxiosInstance('api2');
// Use it like regular axios
const response = await api2Client.get('/specific-endpoint');
res.status(200).json({
status: 'success',
data: response.data
});
}));
// Example 5: Conditional API usage based on availability
router.get('/smart-fetch', asyncHandler(async (req, res) => {
let data;
// Try primary API first, fallback to secondary
if (apiManager.hasAPI('api')) {
try {
data = await apiManager.request('api', '/data');
} catch (error) {
// Fallback to api3 if api fails
if (apiManager.hasAPI('api3')) {
data = await apiManager.request('api3', '/data');
} else {
throw new AppError('No API endpoints available', 503);
}
}
} else if (apiManager.hasAPI('api3')) {
data = await apiManager.request('api3', '/data');
} else {
throw new AppError('No API endpoints configured', 503);
}
res.status(200).json({
status: 'success',
data
});
}));
// Example 6: List all configured APIs
router.get('/api-info', (req, res) => {
const apis = apiManager.getAllAPIs();
const apiInfo = Object.entries(apis).map(([name, config]) => ({
name,
baseURL: config.baseURL,
method: config.method,
timeout: config.timeout,
retries: config.retries
}));
res.status(200).json({
status: 'success',
count: apiInfo.length,
apis: apiInfo
});
});
// Example 7: Proxy endpoint for any API
router.get('/proxy/:apiName/*', asyncHandler(async (req, res) => {
const { apiName } = req.params;
const endpoint = req.params[0];
if (!apiManager.hasAPI(apiName)) {
throw new AppError(`API '${apiName}' not found`, 404);
}
const data = await apiManager.request(apiName, `/${endpoint}`, {
method: req.method,
params: req.query
});
res.status(200).json({
status: 'success',
api: apiName,
endpoint,
data
});
}));
module.exports = router;