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

How to add widget fields based on 3rd party API response?

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

在撇号 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 函数而无需回调。