Amazon s3 Graphql将图像上载到s3-createReadStream()';最大调用堆栈大小错误';-以前的所有解决方案都已尝试过
我正在为学校做一个项目,并试图将一个图像上传到s3以与graphql一起使用。这似乎是导致以下错误的已知问题Amazon s3 Graphql将图像上载到s3-createReadStream()';最大调用堆栈大小错误';-以前的所有解决方案都已尝试过,amazon-s3,graphql,apollo-server,Amazon S3,Graphql,Apollo Server,我正在为学校做一个项目,并试图将一个图像上传到s3以与graphql一起使用。这似乎是导致以下错误的已知问题 C:\Users\Austin Schroeders\Desktop\ut-bootcamp-coding-class\stock-talk-app\server\node_modules\@apollographql\graphql-upload-8-fork\node_modules\fs-capacitor\lib\index.js:80 open() { Ran
C:\Users\Austin Schroeders\Desktop\ut-bootcamp-coding-class\stock-talk-app\server\node_modules\@apollographql\graphql-upload-8-fork\node_modules\fs-capacitor\lib\index.js:80
open() {
RangeError: Maximum call stack size exceeded
at ReadStream.open (C:\Users\Austin Schroeders\Desktop\ut-bootcamp-coding-class\stock-talk-app\server\node_modules\@apollographql\graphql-upload-8-fork\node_modules\fs-capacitor\lib\index.js:80:7)
at _openReadFs (internal/fs/streams.js:138:12)
at ReadStream.<anonymous> (internal/fs/streams.js:131:3)
at ReadStream.deprecated [as open] (internal/util.js:89:15)
at ReadStream.open (C:\Users\Austin Schroeders\Desktop\ut-bootcamp-coding-class\stock-talk-app\server\node_modules\@apollographql\graphql-upload-8-fork\node_modules\fs-capacitor\lib\index.js:90:11)
at _openReadFs (internal/fs/streams.js:138:12)
at ReadStream.<anonymous> (internal/fs/streams.js:131:3)
at ReadStream.deprecated [as open] (internal/util.js:89:15)
我多次发现的第二个解决方案是将const typeDefs=gqlscaler Upload….
添加到typeDefs的开头,并将Upload:false
添加到服务器。当我这样做的时候,我会得到一个错误,上面写着“Post body missing”。你忘了使用body解析器中间件了吗?`我考虑过解决这个问题,但显然我已经有了applyMiddleware,它添加了body解析器,所以我发布的代码没有包括scaler上传
我只是在后端工作,下面是相关代码。我去掉了其他有效的查询、突变和授权,只是尝试提供相关代码
server.js
const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const { typeDefs, resolvers } = require('./schemas');
const db = require('./config/connection');
const PORT = process.env.PORT || 3001;
const app = express();
const server = new ApolloServer({
typeDefs,
resolvers
});
server.applyMiddleware({ app });
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
db.once('open', () => {
app.listen(PORT, () => {
console.log(`API server running on port ${PORT}!`);
console.log(`Use GraphQL at http://localhost:${PORT}${server.graphqlPath}`);
});
});
typeDefs.js
const { gql } = require('apollo-server-express');
const typeDefs = gql`
type S3Object {
eTag: String
location: String
key: String
bucket: String
}
type Mutation {
uploadFile(file: Upload!): S3Object
}
`;
module.exports = typeDefs;
resolver.js
const { AuthenticationError, ApolloError } = require('apollo-server-express');
const AWS = require('aws-sdk');
const { v4: uuidv4 } = require('uuid');
require('dotenv').config();
AWS.config.update({
accessKeyId: process.env.AWS_ACCESS_ID,
secretAccessKey: process.env.AWS_SECRET_KEY,
region: process.env.AWS_REGION,
bucket: process.env.AWS_S3_BUCKET_NAME
});
const s3 = new AWS.S3({ region: process.env.AWS_REGION });
const s3DefaultParams = {
ACL: 'public-read',
Bucket: process.env.AWS_S3_BUCKET_NAME,
Conditions: [
['content-length-range', 0, 256000] // 256k Kb
],
};
const handleFileUpload = async file => {
const { createReadStream, filename } = await file;
const key = uuidv4();
return new Promise((resolve, reject) => {
debugger;
s3.upload(
{
...s3DefaultParams,
// Body: "this is body test",
Body: createReadStream(),
Key: `${key}/${filename}`,
},
(err, data) => {
if (err) {
console.log('error uploading...', err);
reject(err);
} else {
console.log('successfully uploaded file...', data);
resolve(data);
}
},
);
});
};
const resolvers = {
Mutation: {
uploadFile: async (parent, { file }, context) => {
const response = await handleFileUpload(file);
console.log("this is response line 156" + JSON.stringify(response));
var newFile = JSON.stringify(response);
console.log("this is newFile" + newFile);
var parsedFile = JSON.parse(newFile);
console.log("this is parsedFile Location " + parsedFile.Location);
// return parsedFile.Location;
return parsedFile;
// return response;
}
}
};
module.exports = resolvers;
package.json
{
"name": "mern-server",
"version": "1.0.0",
"main": "server.js",
"scripts": {
"start": "node server.js",
"watch": "nodemon",
"seed": "node seeders/seeds.js",
"preinstall": "npm i npm-force-resolutions"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"apollo-server-express": "^2.24.1",
"aws-sdk": "^2.919.0",
"bcrypt": "^4.0.1",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"faker": "^4.1.0",
"fs-capacitor": "^6.2.0",
"graphql": "^15.5.0",
"graphql-upload": "^12.0.0",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.9.9",
"npm-force-resolutions": "0.0.10",
"uuid": "^8.3.2"
},
"resolutions": {
"fs-capacitor": "^6.2.0",
"graphql-upload": "^12.0.0"
},
"devDependencies": {
"nodemon": "^2.0.3"
}
}
我认为这应该是一切相关的,并感谢任何可以提供的帮助
{
"name": "mern-server",
"version": "1.0.0",
"main": "server.js",
"scripts": {
"start": "node server.js",
"watch": "nodemon",
"seed": "node seeders/seeds.js",
"preinstall": "npm i npm-force-resolutions"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"apollo-server-express": "^2.24.1",
"aws-sdk": "^2.919.0",
"bcrypt": "^4.0.1",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"faker": "^4.1.0",
"fs-capacitor": "^6.2.0",
"graphql": "^15.5.0",
"graphql-upload": "^12.0.0",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.9.9",
"npm-force-resolutions": "0.0.10",
"uuid": "^8.3.2"
},
"resolutions": {
"fs-capacitor": "^6.2.0",
"graphql-upload": "^12.0.0"
},
"devDependencies": {
"nodemon": "^2.0.3"
}
}