@loopback/rest
Version:
Expose controllers as REST endpoints and route REST API requests to controller methods
60 lines (56 loc) • 1.76 kB
text/typescript
// Copyright IBM Corp. and LoopBack contributors 2018,2020. All Rights Reserved.
// Node module: @loopback/rest
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
import {BindingScope, injectable, Provider} from '@loopback/core';
import {asMiddleware, Middleware} from '@loopback/express';
import {RestBindings, RestTags} from '../keys';
import {RestMiddlewareGroups} from '../sequence';
import {writeResultToResponse} from '../writer';
/**
* Provides the function that populates the response object with
* the results of the operation.
*
* @returns The handler function that will populate the
* response with operation results.
*/
({scope: BindingScope.SINGLETON})
export class SendProvider {
static value() {
return writeResultToResponse;
}
}
(
asMiddleware({
group: RestMiddlewareGroups.SEND_RESPONSE,
downstreamGroups: [
RestMiddlewareGroups.CORS,
RestMiddlewareGroups.INVOKE_METHOD,
],
chain: RestTags.REST_MIDDLEWARE_CHAIN,
}),
{scope: BindingScope.SINGLETON},
)
export class SendResponseMiddlewareProvider implements Provider<Middleware> {
value(): Middleware {
return async (ctx, next) => {
const send = await ctx.get(RestBindings.SequenceActions.SEND);
const reject = await ctx.get(RestBindings.SequenceActions.REJECT);
try {
/**
* Invoke downstream middleware to produce the result
*/
const result = await next();
/**
* Write the result to HTTP response
*/
send(ctx.response, result);
} catch (err) {
/**
* Write the error to HTTP response
*/
reject(ctx, err);
}
};
}
}