如何通过 Typescript REST CALLS 将文件上传到 Azure Data Lake

How to upload File to Azure Data Lake through Typescript REST CALLS

我的问题是仅使用 Typescript 将文件从本地目录上传到 Azure Data Lake Store。然后我发现了非常有用的 REST API 解决方案,我测试了 REST API 以通过邮递员执行所有必需的操作并且它们工作正常,然后我转移到 Typescript 以从 typescript 进行这些调用。这是 link:https://docs.microsoft.com/en-us/azure/data-lake-store/data-lake-store-data-operations-rest-api

为了通过 Typescript 进行 REST CALLS,我正在使用 request-promise 包,我使用 npm install request-promise 命令安装.此包的文档在 link 中提供:- https://github.com/request/request

但我能够执行 REST 的所有操作 API 即;服务到服务身份验证、创建文件夹、列出文件夹、重命名文件、读取文件等。但是我无法执行两个 operations/REST CALLS 即; 上传文件和删除文件,每次我进行此调用时,它都会给出 运行 时间异常和错误代码 501,说明此操作尚未实现 虽然我已经通过 Post Man 测试了这些操作,并且它们以这种方式工作得很好。

访问有问题还是什么?

这是 Typescript 的代码:

var fs = require('fs');
var request = require('request-promise');
var accessToken; 


getAccessToken();
setTimeout(listFolders, 5000);
setTimeout(renameFile, 5000);
setTimeout(uploadData, 5000);
setTimeout(readData, 5000);


function getAccessToken() {
    request(
    {
        method: 'post',
        url: 'https://login.microsoftonline.com/067e9632-ea4c-4ed9-9e6d-
        e294956e284b/oauth2/token',
        form: {
            grant_type: 'client_credentials',
            resource: 'https://management.core.windows.net/',
            client_id: 'dc9a4034-b03f-4974-9760-99541137a31c',
            client_secret: 'mJ1Eba+sz0hXQko7gBN3D5WPDVLySCHXg4Mg5F4Ru4s='
        },
        json: true,
    }, function (error, response, body) {
        //Print the Response
        accessToken = body.access_token;
        console.log(accessToken);
    });
}
function uploadData() {
    fs.createReadStream('E:/accessToken.txt')
    .pipe(request({
    method: 'post',
    url:
  'https://bswadls.azuredatalakestore.net/webhdfs/v1/iModelAnalytics/abc.txt?
   op=CREATE',
   json: true,
   headers: {
        "Authorization": "Bearer " + accessToken,
    }
    },
    function (error, response, body) {
    console.log(response.status);
        }
    ));

}

function readData() {
  request(
    {
        method: 'GET',
        url: 'https://bswadls.azuredatalakestore.net/webhdfs/v1/iModelAnalyti
        cs/readFile1.txt?op=OPEN'
        headers: {
            "Authorization": "Bearer " + accessToken,
        },
        json: true,
    }, function (error, response, body) {
        //Print the Response
        console.log("\n\nData = "+body);
        //console.log(response);
    }
);
}

function listFolders() {
    request(
    {
        method: 'GET',
        url: 'https://bswadls.azuredatalakestore.net/webhdfs/v1/
        iModelAnalytics?op=LISTSTATUS',
        headers: {
            "Authorization": "Bearer " + accessToken,
        },
        json: true,
    }, function (error, response, body) {
        //Print the Response
        console.log("************List Folders*****************\n ");
        console.log(body);
    }
);
}

function deleteFile() {
    request(
    {
        method: 'PUT',
        url: 'https://bswadls.azuredatalakestore.net/webhdfs/v1/
        iModelAnalytics/readFile.txt?op=DELETE',
        headers: {
            "Authorization": "Bearer " + accessToken,
        },
        json: true,
    }, function (error, response, body) {
        //Print the Response
        console.log("***************Delete File*****************\n ");
        console.log(body);
        console.log('Response= \n');
        console.log(response);
    }
);
}

function renameFile() {
    request(
    {
        method: 'PUT',
        url: 'https://bswadls.azuredatalakestore.net/webhdfs/v1/
        iModelAnalytics/readFile1.txt?
        op=RENAME&destination=/iModelAnalytics/readFile2.txt',
        headers: {
            "Authorization": "Bearer " + accessToken,
        },
        json: true,
    }, function (error, response, body) {
        //Print the Response
        console.log("*************************Delete File*****************\n 
   ");
        console.log(body);
        console.log('Response= \n');
        console.log(response);
    }
);
} 

这是我得到的错误:

请分享对此的任何想法。

非常感谢。

  • PUT应该用来upload data whereas DELETE should be used to delete a file
  • 通过 pipe 上传数据时,将此 &write=true 附加到查询字符串。

尝试将代码更改为:

function uploadData() {
    fs.createReadStream('E:/accessToken.txt').pipe(request({
        method: 'put',
        url:'https://bswadls.azuredatalakestore.net/webhdfs/v1/iModelAnalytics/abc.txt?op=CREATE&write=true',
        json: true,
        headers: {
            "Authorization": "Bearer " + accessToken,
        }
    }, function (error, response, body) {
        console.log(response.status);
    }));

}

function deleteFile() {
    request({
        method: 'delete',
        url: 'https://bswadls.azuredatalakestore.net/webhdfs/v1/iModelAnalytics/readFile.txt?op=DELETE',
        headers: {
            "Authorization": "Bearer " + accessToken,
        },
        json: true
    }, function (error, response, body) {
        //Print the Response
        console.log("***************Delete File*****************\n ");
        console.log(body);
        console.log('Response= \n');
        console.log(response);
    });
}