Below are various examples and snippets that make use of most components in HyperExpress.
const HyperExpress = require('hyper-express');
const webserver = new HyperExpress.Server();
// Create GET route to serve 'Hello World'
webserver.get('/', (request, response) => {
response.send('Hello World');
})
// Activate webserver by calling .listen(port, callback);
webserver.listen(80)
.then((socket) => console.log('Webserver started on port 80'))
.catch((error) => console.log('Failed to start webserver on port 80'));
webserver.post('/api/v1/delete_user/:id', async (request, response) => {
let headers = request.headers;
let id = request.path_parameters.id;
let body = await request.json(); // we must await as .json() returns a Promise
// body will contain the parsed JSON object or an empty {} object on invalid JSON
// Do some stuff here
});
webserver.post('/api/v1/delete_user/:id', async (request, response) => {
// Some bad stuff happened and this request is now forbidden
// We multiple response network calls in atomic callback for best performance
response.atomic(() => {
// All methods EXCEPT "response ending methods" such as send(), json(), upgrade() support chaining
response
.status(403) // Set the response HTTP status code
.header('x-app-id', 'some-app-id') // Sets some random header
.header('x-upstream-location', 'some_location') // Sets some random header
.cookie('frontend_timeout', 'v1/delete_user', 1000 * 60 * 30, {
secure: true,
httpOnly: true
}) // Sets some frontend cookie for enforcing front-end timeout
.cookie('some_sess_id', null) // Deletes some session id cookie
.type('html') // Sets content-type header according to 'html'
.send(rendered_html) // Sends response with some rendered_html as the body
})
});
const fs = require('fs');
webserver.post('/assets/some_video.mkv', async (request, response) => {
// Create a readable stream for the file
const readable = fs.createReadStream('/path/to/some_video.mkv');
// Handle any errors from the readable
readable.on('error', (error) => some_logger(error));
// Easily stream the video data to receiver
response.stream(readable);
});
const fs = require('fs');
webserver.post('/stream/some-data', async (request, response) => {
// Get some readable stream which will retrieve our large dataset
const readable = getReadableStreamForOurData();
// Simply pipe the stream to the Response writable to serve it to the client
readable.pipe(response);
});
// Assume webserver is a HyperExpress.Server instance
// Bind a global middleware that executes on all incoming requests
// These also execute before route/method specific middlewares as they are global
webserver.use((request, response, next) => {
// Do some asynchronous stuff
some_asynchronous_call((data) => {
// you can assign values onto the request and response objects to be accessed later
request.some_data = data;
// We're all done, so let's move on
next();
});
});
const specific_middleware1 = (request, response, next) => {
console.log('route specific middleware 1 ran!');
return next();
};
const specific_middleware2 = (request, response, next) => {
console.log('route specific middleware 2 ran!');
return next();
};
// Bind a route/method specific middleware
// Middlewares are executed in the order they are specified in the middlewares Array
webserver.get('/', {
middlewares: [specific_middleware1, specific_middleware2]
}, (request, response) => {
// Handle your request as you normally would here
return response.send('Hello World');
});
const webserver = new HyperExpress.Server();
// Create an upgrade route so we can authenticate incoming connections
webserver.upgrade('/ws/connect', async (request, response) => {
// Do some kind of asynchronous verification here
// Upgrade the incoming request with some context
response.upgrade({
user_id: 'some_user_id',
event: 'news_updates'
});
});
// Create websocket route to handle opened websocket connections
webserver.ws('/ws/connect', (ws) => {
// Log when a connection has opened for debugging
console.log('user ' + ws.context.user_id + ' has connected to consume news events');
// Handle incoming messages to perform changes in consumption
ws.on('message', (message) => {
// Make some changes to which events user consumes based on incoming message
});
// Do some cleanup once websocket connection closes
ws.on('close', (code, message) => {
console.log('use ' + ws.context.user_id + ' is no longer listening for news events.');
// You may do some cleanup here regarding analytics
});
});