首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从运行express-graphql的节点服务器向GraphQLUpload发送imagekit.io

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

Stack Overflow用户
提问于 2019-10-24 16:18:34
回答 1查看 300关注 0票数 1

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

我正在发送一个图像文件从一个反应前端通过一个graphQL突变到一个节点服务器运行快速图to。uploadFile变异正确工作,并且我能够在服务器上本地保存文件。

我想将这个文件上传到imagekit.io,返回url,然后将url作为graqhQL变异的返回发送到客户端,我正在使用imagekit npm包,我已经按照api文档中的描述配置了它。

最终,我宁愿直接将文件流到imagekit,而不将其保存到服务器上,但我仍在研究这是否可行(非常感谢您的建议),但这不是主要问题。

图像通过imagekit.upload()发送到imagekit,返回消息声明它被成功保存,但是文件类型是“非图像”,而不管文件类型是什么(尝试过的jpg、png、webp)。

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

任何人所能提供的任何建议/帮助都将是非常感谢的。

app.js (服务器)

代码语言:javascript
复制
import schema from './schema'
...
app.use('/graphql', 
    graphqlUploadExpress({ maxFileSize: 10000000, maxFiles: 10 }),
    graphqlHTTP({
        schema,
        graphiql: true
    })
)
...

schema.js

代码语言:javascript
复制
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()的响应:

代码语言:javascript
复制
{
  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'
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-25 14:07:16

在研究了正确使用fs.createReadStream和承诺之后,修正了这个问题。编码和发送仅仅是流的完美工作。

代码语言:javascript
复制
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))
        })

    });
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58545380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档