Nuxt.js 是一个基于 Vue.js 的通用应用框架,它简化了服务器端渲染(SSR)和其他高级功能(如静态站点生成)的实现。
GraphQL 是一种用于 API 的查询语言,它提供了一种更高效、灵活的数据查询方式,相比于传统的 RESTful API,GraphQL 允许客户端精确地获取所需的数据。
Apollo Client 是一个强大的 GraphQL 客户端,它提供了与 GraphQL API 交互的功能,并且可以与 Nuxt.js 等前端框架无缝集成。
在 GraphQL 中,上传文件通常使用 Upload
类型。这是一个特殊的标量类型,用于处理文件上传。
首先,需要在 GraphQL 服务器上定义一个 mutation 来处理文件上传。以下是一个简单的示例:
const { ApolloServer, gql } = require('apollo-server');
const { GraphQLUpload } = require('graphql-upload');
const fs = require('fs');
const path = require('path');
const typeDefs = gql`
scalar Upload
type Mutation {
uploadFile(file: Upload!): String
}
`;
const resolvers = {
Upload: GraphQLUpload,
Mutation: {
uploadFile: async (_, { file }) => {
const { createReadStream, filename, mimetype } = await file;
const stream = createReadStream();
const pathName = path.join(__dirname, 'uploads', filename);
const writeStream = fs.createWriteStream(pathName);
stream.pipe(writeStream);
return pathName;
},
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
在前端,可以使用 apollo-upload-client
库来处理文件上传。以下是一个简单的示例:
<template>
<div>
<input type="file" @change="handleFileChange" />
</div>
</template>
<script>
import { useMutation } from '@vue/apollo-composable';
import gql from 'graphql-tag';
import { createUploadLink } from 'apollo-upload-client';
const uploadLink = createUploadLink({
uri: 'http://localhost:4000/graphql',
});
const apolloClient = new ApolloClient({
link: uploadLink,
cache: new InMemoryCache(),
});
const UPLOAD_FILE = gql`
mutation UploadFile($file: Upload!) {
uploadFile(file: $file)
}
`;
export default {
setup() {
const { mutate } = useMutation(UPLOAD_FILE, { client: apolloClient });
const handleFileChange = (event) => {
const file = event.target.files[0];
if (file) {
mutate({ file })
.then((response) => {
console.log('File uploaded successfully:', response.value);
})
.catch((error) => {
console.error('Error uploading file:', error);
});
}
};
return {
handleFileChange,
};
},
};
</script>
通过以上步骤,你可以实现一个基本的文件上传功能。根据具体需求,你可能需要进一步优化和扩展这个功能。