pnp / pnpjs

Fluent JavaScript API for SharePoint and Microsoft Graph REST APIs
https://pnp.github.io/pnpjs/
Other
749 stars 305 forks source link

Caching does not work at all in 3.22, but works just fine in 3.21 #2935

Closed tandrasi closed 6 months ago

tandrasi commented 6 months ago

Major Version

3.x

Minor Version Number

3.22

Target environment

SharePoint Framework

Additional environment details

Expected or Desired Behavior

I'm trying to retrieve list items and choice column values from a list. I expect that when I have caching enabled .using(Caching(...)) that it stores cached data in my local storage (now that I type this, I haven't tested changing it to session storage) and reads it on subsequent calls.

Observed Behavior

What I see is:

3.21 Works as expected with all caching and even paged results. Thanks to the following bug report, I see paging was fixed as of 3.21 #2836 and it works great! All other paging works as expected. I can see the cached data written to local storage and it is read correctly. Paged results even retrieve their "getNext()" results correctly (thanks again for that fix in 3.21!).

3.22

Steps to Reproduce

We are using a huge shared library in house. There are many things that are spread between multiple files and classes. So I'll just copy the imports here and then just copy/paste the main functions.

Please see "Observed Behavior" above as that outlines what I'm experiencing. Basically using the same code with 3.21 works yet it completely fails with 3.22 (regarding caching).

import "@pnp/sp/webs";
import "@pnp/sp/lists";
import "@pnp/sp/items";
import "@pnp/sp/batching";
import "@pnp/sp/sites";
import "@pnp/sp/fields";
import "@pnp/sp/attachments";
import "@pnp/sp/site-users/web";
import "@pnp/sp/profiles";
import "@pnp/sp/search";

Get list items. Uses paging.

public async getListItems(listTitle: string, selectFields: Array<string>, expandFields: string = "", filter: string = "", orderBy: string = "Id", ascending: boolean = false, startingIndex: number = 0, top: number = 0, webUrl: string = "", cachingOptions?: ICachingOptions): Promise<any[]> {
    try {
        const web = this.getWeb(webUrl);
        let itemCollection: PagedItemCollection<any> = null;

        try {
            const query = web.lists.getByTitle(listTitle).items
                .filter(filter).select(selectFields.join(","))
                .skip(startingIndex).top(top).expand(expandFields);

            if (this.shouldCache(cachingOptions?.enable))
                query.using(Caching(cachingOptions.props))

            itemCollection = await query.getPaged();

        } catch (e) {
            // silently continue
        }

        if (EntityHelper.isNullOrUndefined(itemCollection))
            return [];

        if (!itemCollection.hasNext) {
            if (orderBy)
                return EntityHelper.copyAndSort(itemCollection.results, orderBy, !ascending);
            else
                return itemCollection.results;
        } else {
            let results: Array<any> = [].concat(itemCollection.results);

            while (itemCollection.hasNext) {
                itemCollection = await itemCollection.getNext();
                results = results.concat(itemCollection.results);
            }

            if (orderBy)
                return EntityHelper.copyAndSort(results, orderBy, !ascending);
            else
                return results
        }
    }
    catch (e) {
        console.error(e);
        return null;
    }
}

Get choice column values

public async getChoiceColumnValues(listTitle: string, columnName: string, webUrl: string = "", cachingOptions?: ICachingOptions): Promise<Array<string>> {
    try {
        const web = this.getWeb(webUrl);
        const query = web.lists.getByTitle(listTitle).fields.getByInternalNameOrTitle(columnName);

        if (this.shouldCache(cachingOptions?.enable))
            query.using(Caching(cachingOptions.props));

        const field = await query();

        // Note: Single type Choice field type is 6, multi-choice field is type 15: "field.FieldTypeKind"
        if (!field || Object.prototype.hasOwnProperty.call(field, "Choices") === false) {
            return [];
        }

        return field.Choices;
    }
    catch (e) {
        console.error(e);
        return null;
    }
}
juliemturner commented 6 months ago

Yes, we're aware the fix will go out in today's release: https://github.com/pnp/pnpjs/pull/2929

github-actions[bot] commented 6 months ago

This issue is locked for inactivity or age. If you have a related issue please open a new issue and reference this one. Closed issues are not tracked.