【发布时间】:2021-07-14 21:34:02
【问题描述】:
我正在尝试创建一个读取流,以便将文件从我的客户端应用程序 (react) 上传到 nodejs 服务器。
它在创建 readStream 时崩溃。
这是我的代码:
我正在使用 node v14.15.1 和所有包的最新版本。
├── apollo-server-express@2.23.0
├── apollo-server@2.23.0
├── bcrypt@5.0.1
├── bcryptjs@2.4.3
├── body-parser@1.19.0
├── concurrently@6.0.2
├── cors@2.8.5
├── cross-env@7.0.3
├── express-graphql@0.12.0
├── express-promise-router@4.1.0
├── express@4.17.1
├── fs@0.0.1-security
├── graphql-resolvers@0.4.2
├── graphql-upload@11.0.0
├── graphql@15.5.0
├── joi@17.4.0
├── node-sass@5.0.0
├── nodemailer@6.5.0
├── nodemon@2.0.7
├── npm-check-updates@11.5.0
├── nyc@15.1.0
├── passport-jwt@4.0.0
├── passport-local@1.0.0
├── passport@0.4.1
├── pg@8.6.0
├── query-string@7.0.0
├── sequelize@6.6.2
架构
module.exports = gql`
scalar Upload // New!
type File {
filename: String!
mimetype: String!
encoding: String!
}
extend type Mutation {
uploadFile(file: Upload!): File!
}
解析器
module.exports = {
Upload: GraphQLUpload, // New!
Mutation: {
async singleUpload(parent, { file }) {
try {
let t = await typeCheck(file);
if (t) {
return uploadProcess(file);
} else {
return {
success: false,
message: "Type Error",
};
}
} catch (err) {
console.log(err);
return err;
}
},
}
}
let typeCheck = async (item) => {
let { mimetype } = await item;
if (!(mimetype === "image/png" || mimetype === "image/jpeg")) {
return false;
} else {
return true;
}
};
let uploadProcess = async (file) => {
let { createReadStream, filename, mimetype, encoding } = await file;
let stream = createReadStream();
let path = "uploads/" + uuid() + filename;
return new Promise((resolve, reject) =>
stream
.on("error", (error) => {
if (error) fs.unlinkSync(path);
reject({
success: false,
message: "Some Error",
});
})
.pipe(createWriteStream(path))
.on("finish", () => {
resolve({
filename,
mimetype,
encoding,
location: path,
success: true,
message: "Successfully Uploaded!",
});
})
);
};
索引
const apolloServer = new ApolloServer({
typeDefs,
resolvers,
uploads: false, // New!
context,
// introspection: true,
playground: {
settings: {
"schema.polling.enable": false,
"editor.fontSize": 18,
},
},
});
app.use(graphqlUploadExpress()); // New!
客户:
const uploadLink = createUploadLink({
uri: "http://localhost:5000/graphql", // Apollo Server is served from port 4000
// headers: {
// "keep-alive": "true",
// },
});
const appClient = new ApolloClient({
link: uploadLink,
cache: new InMemoryCache(),
});
const SINGLE_UPLOAD = gql`
mutation singleUpload($file: Upload!) {
singleUpload(file: $file) {
filename
mimetype
encoding
}
}
`;
const UploadFile = () => {
const [mutate, { loading, error }] = useMutation(SINGLE_UPLOAD);
const onChange = ({
target: {
validity,
files: [file],
},
}: any) => validity.valid && mutate({ variables: { file } });
if (loading) return <div>Loading...</div>;
if (error) return <div>{JSON.stringify(error, null, 2)}</div>;
return (
<React.Fragment>
<input type="file" required onChange={onChange} />
</React.Fragment>
);
};
export default UploadFile;
错误:
Debugger attached.
#
# Fatal error in , line 0
# Check failed: AllowJavascriptExecution::IsAllowed(isolate).
#
#
#
#FailureMessage Object: 0000007B4B6079E0
1: 00007FF7F317021F napi_wrap+109311
2: 00007FF7F30A48DF std::basic_ostream<char,std::char_traits<char> >::operator<<+57151
3: 00007FF7F3CDD442 V8_Fatal+162
4: 00007FF7F38CF7C8 v8::internal::Execution::CallWasm+1992
5: 00007FF7F38CEEDF v8::internal::Execution::Call+191
6: 00007FF7F39BA827 v8::Function::Call+615
7: 00007FF7F3419CBD v8_inspector::V8StackTraceId::ToString+35213
8: 00007FF7F34320B8 v8_inspector::V8Inspector::Counters::getCounterPtr+51800
9: 00007FF7F343A319 v8_inspector::V8Inspector::Counters::getCounterPtr+85177
10: 00007FF7F342545F v8_inspector::V8Inspector::create+4991
11: 00007FF7F3439F97 v8_inspector::V8Inspector::Counters::getCounterPtr+84279
12: 00007FF7F3903675 v8::internal::Debug::IsBlackboxed+661
13: 00007FF7F39039FB v8::internal::Debug::IsFrameBlackboxed+123
14: 00007FF7F390397C v8::internal::Debug::IsExceptionBlackboxed+140
15: 00007FF7F39048E7 v8::internal::Debug::OnException+295
16: 00007FF7F3904CC8 v8::internal::Debug::OnThrow+312
17: 00007FF7F38C4C7F v8::internal::Isolate::Throw+543
18: 00007FF7F38C4497 v8::internal::Isolate::StackOverflow+327
19: 00007FF7F35BD9C4 v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=+12116
20: 00007FF7F3A68EFD v8::internal::SetupIsolateDelegate::SetupHeap+463949
21: 00007FF7F3A01BBF v8::internal::SetupIsolateDelegate::SetupHeap+41231
22: 00007FF7F3A018E2 v8::internal::SetupIsolateDelegate::SetupHeap+40498
你知道出了什么问题吗?
我已尝试注释掉写入流,但该过程在创建 readStream 时失败。
【问题讨论】:
标签: javascript node.js reactjs graphql