如何根据第三方API响应添加小部件字段?

时间:2019-08-12 08:37:48

标签: apostrophe-cms

在特殊情况下,我需要一个小部件,它具有一个基于第三方API响应的附加字段。现在,问题是我必须等待API请求给出响应,并且beforeConstruct也变得异步,其结果是构造函数填充的运行和终止要比beforeConstruct更早,并且在管理面板中新字段不是可见。

const request = require( 'request-promise' );

module.exports = {
    extend: 'apostrophe-widgets',
    label: 'Widget name',

    beforeConstruct: async function( self, options )
    {
        var fields = [];
        var arrangements = [];
        var optionalFields =
        {
            name: 'optionalFields',
            label: 'Optional Fields',
            fields: []
        };

        const apiResponse = await request( {
            method: 'POST',
            body: {
                // criteria for search
            },
            uri: API_ENDPOINT,
            json: true
        } );

        var newField =
        {
            name: apiResponse.fieldName,
            label: apiResponse.fieldName,
            type: 'string',
        };
        fields.push( contact );
        optionalFields.fields.push( apiResponse.fieldName );
        arrangements.push( optionalFields );

        options.addFields = fields.concat( options.addFields || [] );
        options.arrangeFields = arrangements.concat( options.arrangeFields || [] );
    }
};

您是否有任何想法如何等待beforeConstruct完成?

另一个问题(在这里写出来,因为基本上是相同的问题):如果我必须基于数据库片段类型集合向窗口小部件中添加新字段: await self.apos.docs.getManager( 'optionals' ).find( req, {}, { trash: false } ).toArray(); 如何以某种方式从DB同步获取值?

1 个答案:

答案 0 :(得分:0)

在Apostrophe 2.x中,由于遗留原因,如果您想让beforeConstructconstructafterConstruct等待异步工作完成,则必须使用回调。但是您仍然可以在内部使用async/await;只需确保try/catch并适当处理回调即可:

beforeConstruct: async function(self, options, callback) {
  try {
    const info = await someApiCallHere();
    options.addFields = [ ... use info here ... ];
    return callback(null);
  } catch (e) {
    return callback(e);
  }
}

在Apostrophe 3.x中,将支持仅使用async函数而不进行回调。