Search code examples
javascriptsharepointspfxspservices

spservices.js is returning this error:- Uncaught (in > promise) TypeError: Cannot read properties of undefined (reading > 'LookupList')


Inside our SPFx SharePoint online web part we have the following code inside a javascript file:-

spservices.prototype.getLookupFieldOptions = function (siteUrl, listId, fieldInternalName) {
        return __awaiter(this, void 0, void 0, function () {
            var fieldOptions, web, results, options, _i, options_1, option, error_14;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        fieldOptions = [];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 5, , 6]);
                        web = new Web(siteUrl);
                        return [4 /*yield*/, web.lists.getById(listId)
                                .fields.usingCaching()
                                .filter("InternalName eq '" + fieldInternalName + "'")
                                .select("LookupList", "LookupWebId", "LookupField")
                                .top(1)
                                .get()];
                    case 2:
                        results = _a.sent();
                        if (!results) return [3 /*break*/, 4];
                        return [4 /*yield*/, web.lists.getById(results[0].LookupList)
                                .items.usingCaching()
                                .select("ID", results[0].LookupField)
                                .getAll()];
                    case 3:
                        options = _a.sent();
                        if (options && options.length > 0) {
                            for (_i = 0, options_1 = options; _i < options_1.length; _i++) {
                                option = options_1[_i];
                                fieldOptions.push({
                                    key: option.ID,
                                    text: option[results[0].LookupField]
                                });
                            }
                        }
                        _a.label = 4;
                    case 4: return [3 /*break*/, 6];
                    case 5:
                        error_14 = _a.sent();
                        return [2 /*return*/, Promise.reject(error_14)];
                    case 6: return [2 /*return*/, fieldOptions];
                }
            });
        });
    };

but on runtime the SPFx web part will return this error and it will keep loading forever:-

calendar-web-part_a87ac4ce95dc9057c9f00ccd9727c133.js:1 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'LookupList')

this is the code which is returning the error:-

return [4 /*yield*/, web.lists.getById(results[0].LookupList)

as follow:-

enter image description here

any advice on this please?

I can not post the whole code inside the question, as it will exceed the characters limit.. so i upload the type script file inside this url @ https://1drv.ms/t/s!At147xVvrdC_g1bXKUk9rhwfVCtK?e=lny4kw .. hope this helps thanks


Solution

  • Ok, um idk much about spservices but I do know that kind of error.. so I can assume that the select function attempts to read nested properties for each value you place and I also know that the value web.lists.getById(listId) after all those functions doesn't end up as undefined when it reaches the select function else the error would've been Uncaught (in > promise) TypeError: Cannot read properties of undefined (reading > 'select')

    With that, I'd change your case 1 to this

                        case 1:
                            _a.trys.push([1, 5, , 6]);
                            web = new Web(siteUrl);
                            let someWebListThing=web.lists.getById(listId);
                            const originalSelect=someWebListThing.select.bind(someWebListThing);
                            someWebListThing.select=function(){
                                return originalSelect(...[...arguments].filter(selection=>{
                                    try{originalSelect(selection); return true}
                                    catch{return false} //filters out error causing values so it should work but naturally this is gonna be slower ;-;
                                }))
                            }
                            return [4 /*yield*/, someWebListThing
                                    .fields.usingCaching()
                                    .filter("InternalName eq '" + fieldInternalName + "'")
                                    .select("LookupList", "LookupWebId", "LookupField")
                                    .top(1)
                                    .get()];