【问题标题】:debugger crashes on createReadStream nodeJS调试器在 createReadStream nodeJS 上崩溃
【发布时间】: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


    【解决方案1】:

    我已经关注this 的回答,并设法让它与最新的节点版本一起正常工作。在此之前,我已降级到节点 12,它也能正常工作...

    我已经用最后的代码更新了上面的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 2021-10-04
      • 2022-07-14
      • 2014-09-17
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多