图形QL文件上传普通JS "Must provide query string."



我正在用普通JS将文件上传到GraphQL API。几个月来,我一直在同一个地方做这件事,现在我正试图用NodeJS在外部实现完全相同的东西。

我的代码看起来像这样:

const FormData = require('form-data');
const fs = require('fs')
const axios = require('axios')
const payload = generateRequest(input)
axios.post(apiBaseUrl + "/graphql", payload, {
headers: {...payload.getHeaders()}
}).then(response => {
let res = response.data
if (res.data.triggerPcWorkflow.status === 200) {
console.log("success!")
} else {
console.error(res.data.triggerPcWorkflow.message)
}
})
.catch(err => {
if (err.response) {
console.log(err.response.data);
console.log(err.response.status);
console.log(err.response.headers);
}
})

generateRequest函数生成多部分有效载荷(https://github.com/jaydenseric/graphql-multipart-request-spec)。

我有两个相同版本的后端在localhost:5000mycooldomain.com上运行。当将apiBaseUrl设置为http://localhost:5000时,一切都能完美工作。然而,仅仅通过将URL更改为https://www.mycooldmain.com,我就用{ errors: [ { message: 'Must provide query string.' } ] }收到了一个400错误

BTW:一个简单的query适用于两个URL。。。

这是我的generateRequest函数:

const mutation = `
mutation MyMutation($xyz: String) {
doSomething(myInput: $xyz) {
status 
message
}
}
`
let sendData = new FormData();
const fileNull = [];

// map
files = generateRequestInput.files
let map = '{'
for (let i = 0; i < files.length; i++) {
fileNull.push(null);
map += `"${i}": ["variables.files.${i}"], `
}
map = map.substring(0, map.length-2);
map += '}'
// operations
const operations = JSON.stringify({
query: mutation,
variables: {
"xyz": "Hello"
}
});
// build payload
sendData.append("operations", operations)
sendData.append("map", map)
for (let i = 0; i < files.length; i++) {
sendData.append(i, files[i]);
}
return sendData

我知道map看起来有点丑,但这不是重点(除非是(。

有没有人遇到过类似的问题,或者知道我的错误是什么?谢谢

我跳过了axios依赖项,直接用FormData实现了请求。

下面的代码有效。

function makeRequest(formData, options) {
formData.submit(options, (err, res) => {
if (err) {
console.error(err.message)
return
} else {

if (res.statusCode < 200 || res.statusCode > 299) {
console.error(`HTTP status code ${res.statusCode}`)
}

const body = []
res.on('data', (chunk) => body.push(chunk))
res.on('end', () => {
const resString = Buffer.concat(body).toString()
console.log(resString)
})
}
})
}
const options = {
host: 'mycooldomain.com',
port: 443,
path: '/graphql',
method: 'POST',
protocol: 'https:'
}
makeRequest(payload, options)

相关内容

最新更新