Skip to content

Latest commit

 

History

History
73 lines (55 loc) · 2.67 KB

context.md

File metadata and controls

73 lines (55 loc) · 2.67 KB

Контекст выполнения

Выполнение блока начинается запуском его через de.run:

const block = de.block( ... );

const result = de.run( block );

Процесс выполнения состоит из нескольких фаз выполненияoptions.before, action, options.after и т.д. Кроме того, экшен блока может приводить к запуску других (под)блоков. Мы можем влиять на весь этот процесс задавая блокам options и определяя сами блоки.

Например:

const block = de.http( {

    block: {
        hostname: ( { context } ) => context.api.hostname,
        pathname: ( { params, context } ) => `${ context.api.version }/item/${ params.id }/`,
        ...
    },

    options: {
        after: ( { result, context } ) => {
            context.res.cookie( 'session', result.session, ... );
        }
    }

} );

И удобно иметь возможность во все эти колбэки (pathname, after, ...) передать некий общий объект — это и есть контекст. Например, в нем может быть доступ к объекту res, при помощи которого мы можем выставлять куки. Или же в нем может храниться конфиг, задающий параметры какого-то API. Контекстом может быть что угодно вообще. Можно и вовсе его не передавать, если в нем нет необходимости:

//  Не передаем контекст вообще.
//
const result = de.run( block );


//  Передаем что угодно.
//
const context = 42;
//  Не очень осмысленный контекст, но мало ли.
const result = de.run( block, { context } );


//  Более реалистично
//
const api_config = require( '.../api/config' );

const server = http_.createServer( ( req, res ) => {
    const params = ...;

    //  В req содержится много полезной для выполнения информации.
    //  А в res есть возможность, например, выставлять заголовки ответа,
    //  делать редиректы (не рекомендуется) и т.д.
    //
    const context = {
        req: req,
        res: res,
        api: api_config,
    };

    const result = de.run( block, { params, context } );
} );