如何使用@PnP/SP从列表中查询列表项和附件?
How to query list items and attachments from a list using @PnP/SP?
我正在使用 PNP SP 查询列表项及其附件。如何编写当前函数的正确且简化的版本?
下面的函数有效,我从第一个查询得到结果,它检索 ID、TITLE,LINK。但是我从第二个查询 Title, Link.URL, FileName, ServerRelativeUR 中没有得到任何结果 - 但是当我调试代码时,我可以看到第二个查询正在执行并返回值,但是函数在完成第二个查询之前就离开了.我如何让这个函数正确地查询这两个东西并将它们 returns 给调用者?
private GetCompleteData() : Promise<any>
{
let result : string = "";
return sp.web.lists.getByTitle('LIST').items.select('Id, Title, Link').get().then( response => {
response.forEach( item => {
let attachments = sp.web.lists.getByTitle('LIST').items.getById(item.Id);
attachments.attachmentFiles.select('FileName, ServerRelativeUrl').get().then( responseAttachments => {
responseAttachments.forEach( attachmentItem => {
result += item.Title + "<br/>" +
item.Link.Url + "<br/>" +
attachmentItem.FileName + "<br/>" +
attachmentItem.ServerRelativeUrl + "<br/><br/>";
});
});
});
return result;
});
}
这是我的有效测试代码。
sp.web.lists.getByTitle('MyList').items.select('Id', 'Title', 'EncodedAbsUrl').get().then( response => {
response.forEach( item => {
let _Item = sp.web.lists.getByTitle("MyList").items.getById(item.ID);
_Item.attachmentFiles.select('FileName', 'ServerRelativeUrl').get().
then( responseAttachments => {
responseAttachments.forEach( attachmentItem => {
result += item.Title + "<br/>" +
item.EncodedAbsUrl + "<br/>" +
attachmentItem.FileName + "<br/>" +
attachmentItem.ServerRelativeUrl + "<br/><br/>";
});
});
});
})
您可以使用 expand
属性 在第一个 REST 调用本身中获取数据,而不是对每个列表项进行 REST 调用。
您可以通过以下示例代码对其进行修改:
sp.web.lists.getByTitle("LIST").items.select("Title", "ID", "Links" "AttachmentFiles").
expand("AttachmentFiles").get().then((response) => {
console.log(response);
});
您可以根据需要进行修改。这将为您提供一组列表项的附件,如下所示:
我正在使用 PNP SP 查询列表项及其附件。如何编写当前函数的正确且简化的版本?
下面的函数有效,我从第一个查询得到结果,它检索 ID、TITLE,LINK。但是我从第二个查询 Title, Link.URL, FileName, ServerRelativeUR 中没有得到任何结果 - 但是当我调试代码时,我可以看到第二个查询正在执行并返回值,但是函数在完成第二个查询之前就离开了.我如何让这个函数正确地查询这两个东西并将它们 returns 给调用者?
private GetCompleteData() : Promise<any>
{
let result : string = "";
return sp.web.lists.getByTitle('LIST').items.select('Id, Title, Link').get().then( response => {
response.forEach( item => {
let attachments = sp.web.lists.getByTitle('LIST').items.getById(item.Id);
attachments.attachmentFiles.select('FileName, ServerRelativeUrl').get().then( responseAttachments => {
responseAttachments.forEach( attachmentItem => {
result += item.Title + "<br/>" +
item.Link.Url + "<br/>" +
attachmentItem.FileName + "<br/>" +
attachmentItem.ServerRelativeUrl + "<br/><br/>";
});
});
});
return result;
});
}
这是我的有效测试代码。
sp.web.lists.getByTitle('MyList').items.select('Id', 'Title', 'EncodedAbsUrl').get().then( response => {
response.forEach( item => {
let _Item = sp.web.lists.getByTitle("MyList").items.getById(item.ID);
_Item.attachmentFiles.select('FileName', 'ServerRelativeUrl').get().
then( responseAttachments => {
responseAttachments.forEach( attachmentItem => {
result += item.Title + "<br/>" +
item.EncodedAbsUrl + "<br/>" +
attachmentItem.FileName + "<br/>" +
attachmentItem.ServerRelativeUrl + "<br/><br/>";
});
});
});
})
您可以使用 expand
属性 在第一个 REST 调用本身中获取数据,而不是对每个列表项进行 REST 调用。
您可以通过以下示例代码对其进行修改:
sp.web.lists.getByTitle("LIST").items.select("Title", "ID", "Links" "AttachmentFiles").
expand("AttachmentFiles").get().then((response) => {
console.log(response);
});
您可以根据需要进行修改。这将为您提供一组列表项的附件,如下所示: