Nodejs将附件发布到JIRA

时间:2017-09-05 14:04:23

标签: node.js express jira-rest-api

我正在接收http POST响应OK 200,但我发现JIRA问题上没有文件存在。从我的研究中我可以理解,这可能是我发送请求的formData的一些问题。以下是我的代码:

var newBuffer = new Buffer(req.Payload, 'base64');
var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({
frequency: 10, // in milliseconds.
chunkSize: 2048 // in bytes.
});

// With a buffer
myReadableStreamBuffer.put(newBuffer);
var formData = {
'file': {
'content': myReadableStreamBuffer,
'filename': req.FileName,
'mimeType': req.MimeType //mimeType from JSON
}
};

var options = {
url: 'https://comapny.atlassian.net/rest/api/2/issue/' + req.ReferenceId + '/attachments',
method: "POST",
json: true,
headers: {
'ContentType': 'multipart/form-data',
'Authorization': 'Basic ' + new Buffer(config.jira.jiraUser.userName + ':' + config.jira.jiraUser.password).toString('base64'),
'X-Atlassian-Token': 'nocheck'
},
formData: JSON.stringify(formData)
};

request(options,
function (error, response, body) {
if (error) {
errorlog.error(`Error Message : PostAttachmentToCSMS : ${error}`);
return response.statusCode;
}
else {
successlog.info(`Attachment posted for issue Key: ${req.ReferenceId} ${response.statusMessage}`);
return response.statusCode;
}
});

我可以从myReadableStreamBuffer写文件,所以看起来没问题。请帮我确定问题所在。非常感谢!

3 个答案:

答案 0 :(得分:2)

花了一些时间后,我找到了formData的正确格式: var newBuffer = new Buffer(req.Payload, 'base64'); var formData = { file: { value: newBuffer, options: { filename: req.FileName, contentType: req.MimeType } } };

答案 1 :(得分:0)

对于像我这样的人来说,使用此API会出错。

在花了很多时间为此事奋斗之后,我终于发现这就像一个魅力。在编写此代码之前,我收到“ XSRF检查失败”的403/404错误消息。

// Don't change the structure of formData.
const formData = {
    file: {
        value: fs.createReadStream(filepath),
        options: {
            filename: filename,
            contentType: "multipart/form-data"
        }
    }
};

const header = {
    "Authentication": "Basic xxx",
    // ** IMPORTANT **
    // "Use of the 'nocheck' value for X-Atlassian-Token
    // has been deprecated since rest 3.0.0.
    // Please use a value of 'no-check' instead."
    "X-Atlassian-Token": "no-check",
    "Content-Type": "multipart/form-data"
}

const options = {
    url: "http://[your_jira_server]/rest/api/2/issue/[issueId]/attachments",
    headers: header,
    method: "POST",
    formData: formData
};

const req = request(options, function(err, httpResponse, body) {
    whatever_you_want;
};

答案 2 :(得分:0)

我可以通过以下方式使用 axios 将附件发布到 JIRA:

const axios = require('axios');
const FormData = require('form-data')
const fs = require('fs');

const url = 'http://[your_jira_server]/rest/api/2/issue/[issueId]/attachments';

let data = new FormData();
data.append('file', fs.createReadStream('put image path here'));

var config = {
    method: 'post',
    url: url,
    headers: {
        'X-Atlassian-Token': 'no-check',
        'Authorization': 'Basic',
        ...data.getHeaders()
    },
    data: data,
    auth: {
        username: '',
        password: ''
    }
};

axios(config)
    .then(function (response) {
        res.send({
            JSON.stringify(response.data, 0, 2)
        });
    })
    .catch(function (error) {
        console.log(error);
    });