我正在尝试使用Node.js技术更新Azure帐户上的用户。我正在使用azure-graphapi模块发送请求并进行初始化。 以下是我的代码。
var GraphAPI = require('azure-graphapi');
var graph = new GraphAPI(appSettings.oauthOptions.tenantId, appSettings.oauthOptions.clientId, appSettings.oauthOptions.clientSecret);
var reqHeaders = { "content-type": "application/json" };
var reqBody = {
"department": "Sales",
"usageLocation": "US"
}
var person = {
userId: userID
};
graph.patch('users/f0eceb4f-xxxx-409a-xxxx-4e3exx4e3157', JSON.stringify(reqBody), reqHeaders, function (err, user) {
if (!err) {
console.log(user);
}
else {
console.log(err);
}
});
即使在提供content-Type标头之后,它也会给我一个错误,因为“{[错误:图形API错误:400(错误请求)Content-Type标头值丢失。] statusCode:400}”
如果有人可以帮助我解决这个问题,那将是非常有帮助的。
答案 0 :(得分:2)
您正在使用的此模块中存在多个错误。为了使代码有效,我们应该在GraphAPI.js
中的源代码node_modules/auzre-graphapi
中进行一些其他修改:
从Line 195开始,有一个if
条件stmt,作者似乎忘记定义自line 199以来使用的content
,并且只有在必须将帖子正文解析为buffer
对象,它将设置内容类型标题。因此,我们可以快速修改代码:
if (data) {
if (Buffer.isBuffer(data)) {
options.headers['Content-Type'] = contentType;
} else if (!contentType) {
content = data;
if (typeof content === 'string') {
options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
options.headers['Content-Length'] = content.length;
} else if (content !== null && typeof content === 'object') {
content = JSON.stringify(content);
options.headers['Content-Type'] = 'application/json';
options.headers['Content-Length'] = content.length;
}
} else {
if (typeof contentType === 'string') {
options.headers['Content-Type'] = contentType;
} else if (contentType['Content-type'] !== null) {
options.headers['Content-Type'] = contentType['Content-type'];
}
}
}
然后将标题设置为您的代码:var reqHeaders = { "Content-type": "application/json" };
BTW,正如update user document所指的那样,如果成功,它将在没有响应主体的情况下响应204,因此您的代码将打印" undefined"如果成功。
由于作者不再维护包,他已经为通用Graph API创建了一个新包graph-service。请参阅https://github.com/fhellwig/azure-graphapi/issues/5#issuecomment-211392546