【问题标题】:How to add widget fields based on 3rd party API response?如何根据 3rd 方 API 响应添加小部件字段?
【发布时间】:2019-08-12 23:57:07
【问题描述】:

在特殊情况下,我需要一个小部件,它具有基于 3rd 方 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(); 我可以以某种方式同步地从数据库中获取值吗?

【问题讨论】:

    标签: apostrophe-cms


    【解决方案1】:

    在 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 函数而不使用回调。

    【讨论】:

    • 感谢您的回答!完美的!还要感谢您始终提供快速准确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2020-10-22
    • 2021-07-28
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多