问题
I am trying to use Apollo Server's Upload
scalar to send files to S3 directly. My schema:
const { gql } = require('apollo-server-express')
module.exports = gql`
extend type Mutation {
createPicture(
name: String!
picture: Upload!
): Picture!
}
type Picture {
name: String!
picture: String!
}
`
Resolver:
const { combineResolvers } = require('graphql-resolvers')
const isAuthenticated = require('./auth')
const { uploadPhoto } = require('../services/picture')
module.exports = {
Mutation: {
createPicture: combineResolvers(
isAuthenticated,
async (
parent,
{ name, picture = null },
{ models, me }
) => {
const { createReadStream, filename, mimetype, encoding } = await picture
// Does not get past this line
const stream = createReadStream()
uploadPhoto(stream, filename)
const pictureModel = models.Picture.create({
name,
picture
})
return pictureModel
}
)
}
}
But my code errors like this:
internal/util.js:55
function deprecated(...args) {
^
RangeError: Maximum call stack size exceeded
at ReadStream.deprecated [as open] (internal/util.js:55:22)
at ReadStream.open ([truncated]/node_modules/fs-capacitor/lib/index.js:90:11)
at _openReadFs (internal/fs/streams.js:123:12)
at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
at ReadStream.deprecated [as open] (internal/util.js:70:15)
at ReadStream.open ([truncated]/node_modules/fs-capacitor/lib/index.js:90:11)
at _openReadFs (internal/fs/streams.js:123:12)
at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
at ReadStream.deprecated [as open] (internal/util.js:70:15)
at ReadStream.open ([truncated]/node_modules/fs-capacitor/lib/index.js:90:11)
at _openReadFs (internal/fs/streams.js:123:12)
at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
at ReadStream.deprecated [as open] (internal/util.js:70:15)
at ReadStream.open ([truncated]/node_modules/fs-capacitor/lib/index.js:90:11)
at _openReadFs (internal/fs/streams.js:123:12)
at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
at ReadStream.deprecated [as open] (internal/util.js:70:15)
at ReadStream.open ([truncated]/node_modules/fs-capacitor/lib/index.js:90:11)
at _openReadFs (internal/fs/streams.js:123:12)
at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
at ReadStream.deprecated [as open] (internal/util.js:70:15)
at ReadStream.open ([truncated]/node_modules/fs-capacitor/lib/index.js:90:11)
Note: I am sure the image was sent correctly, as filename
is correct
回答1:
Turns out it was this bug in graphql-upload
. Downgraded to node 12 and it's fixed (solution listed there did not help me)
回答2:
Add this to package.json:
"resolutions": {
"**/**/fs-capacitor":"^6.2.0",
"**/graphql-upload": "^11.0.0"
}
source: https://github.com/jaydenseric/graphql-upload/issues/170#issuecomment-641938198
回答3:
This error occured to me in node version 14 too! I solved it as follows:
Install latest version of graphql-upload !
use graphqlUploadExpress middleware to define the maximum file limit.
import { graphqlUploadExpress } from "graphql-upload"; const app = express() app.use(graphqlUploadExpress({ maxFileSize: 1000000000, maxFiles: 10 }));
Set uploads to false while initializing the ApolloServer
const server = new ApolloServer({ uploads: false, schema, });
回答4:
Using:
"apollo-server": "^2.18.2",
"apollo-server-express": "2.18.2",
"aws-sdk": "^2.771.0",
"express-fileupload": "^1.2.0",
"graphql": "^15.3.0",
"graphql-upload": "^11.0.0",
"fs-capacitor": "^6.2.0",
I solve this by installing the latest fs-capacitor
as a dependency
yarn add fs-capacitor
来源:https://stackoverflow.com/questions/59620803/createreadstream-throwing-rangeerror-maximum-call-stack-size-exceeded-when-up