从运行express graphql的节点服务器向imagekit.io发送GraphQLUpload



这里没有经验的开发人员。这个问题把我逼疯了。

我正在通过graphQL突变从react前端向运行express graphQL的节点服务器发送一个图像文件。uploadFile突变工作正常,我可以在服务器上本地保存文件。

我想把这个文件上传到imagekit.io,返回url,然后把url作为graqhQL突变的返回发送到客户端。我使用的是imagekit npm包,并且我已经按照api文档中的描述进行了配置。

最终,我宁愿将文件直接流式传输到imagekit,而不将其保存到服务器,但我仍在研究这是否可能(建议很好(,但这不是主要问题。

图像通过imagekit.upload((发送到imagekit,返回消息表明它已成功保存,但无论文件类型如何,文件类型都是"非图像"(尝试jpg、png、webp(。

本地保存到节点服务器的图像(据我所知(与客户端发送的图像相同。该图像在我的imagekit媒体库中也可见,但文件大小不正确(<100字节(。这两个观察结果让我相信错误的字符串被发送到imagekit,但我不知道如何正确编码。

任何人能提供的建议/帮助都将不胜感激。

app.js(服务器(

import schema from './schema'
...
app.use('/graphql', 
graphqlUploadExpress({ maxFileSize: 10000000, maxFiles: 10 }),
graphqlHTTP({
schema,
graphiql: true
})
)
...

schema.js

import {GraphQLUpload} from 'graphql-upload'
...
const Mutation = new GraphQLObjectType({
name: 'Mutation',
fields: {
uploadFile:{
description: 'Uploads a file',
type: GraphQLString,
args: {
file: {type: new GraphQLNonNull(GraphQLUpload)},
},
async resolve(parent, {file}){
const { filename, mimetype, createReadStream } = await file
await new Promise(res => 
createReadStream()
.pipe(createWriteStream(path.join(__dirname, "./", filename), {encoding:'base64'}))
.on("close", res)
).then (                 
imagekit.upload({
file : path.join(__dirname, "./", filename), //required
fileName : filename,   //required
}, function(error, result) {
if(error) 
console.log(error)
else {
filesArray.push(filename)
console.log(result)
} 
}
)  
)
return 'Promise that returns the url'
}
},

来自imagekit.upload((的响应:

{
filePath: '/default-image_ANV6NYo5o.jpg',
size: 36,
fileId: '5db1ccc9e954fe57f4c791c9',
url: 'https://ik.imagekit.io/<My imagekit ID here>/default-image_ANV6NYo5o.jpg',
name: 'default-image_ANV6NYo5o.jpg',
fileType: 'non-image'
}

在研究fs.createReadStream和Promises的正确使用后修复了该问题。仅对流进行编码和发送非常有效。

async function encodeFile(file) {
return new Promise(resolve => {
let { filename, mimetype, createReadStream } = file
let encodedFile
createReadStream()
.on('data', chunk => {
encodedFile = chunk.toString('base64')
})
.on('close', () => {
resolve(uploadFile(filename, encodedFile))
})
});
}

最新更新