Express TypeError:无法执行';编译';在';WebAssembly';:响应MIME类型不正确。预期';应用程序/wasm';

Express TypeError:无法执行';编译';在';WebAssembly';:响应MIME类型不正确。预期';应用程序/wasm';,express,webassembly,Express,Webassembly,我正在尝试使用Chrome上的FetchAPI加载一个.wasm文件,并使用express提供一个html文件。但是chrome不允许我加载文件: '未捕获(承诺中)类型错误:未能对'WebAssembly'执行'compile':响应MIME类型不正确。应为“应用程序/wasm” 这是我的档案: /public/index.html <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <met

我正在尝试使用Chrome上的FetchAPI加载一个.wasm文件,并使用express提供一个html文件。但是chrome不允许我加载文件:

'未捕获(承诺中)类型错误:未能对'WebAssembly'执行'compile':响应MIME类型不正确。应为“应用程序/wasm”

这是我的档案:

/public/index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script type="text/javascript">
          WebAssembly.instantiateStreaming(fetch('http://localhost:3000/simple.wasm'))
      .then(obj => {
       console.log(obj.instance.exports.add(1, 2));  // "3"
      });
    </script>
  </body>
</html>
在为.wasm文件提供服务时,是否可以添加新的mime类型来表示? 还是让chrome接受它? 我不知道怎么解决它^^

见:


谢谢大家

快速搜索给了我这个答案

express.static.mime.define({'application/octet stream':['csv']})

来看,github上的Express可能会有所帮助

你只需要等待新快车的发布


或者尝试一下(这对我没有帮助)。

一种可能的解决方法是使用
实例化()
而不是
实例化处理()
,因为前者不关心MIME类型(而后者)。要使用
实例化()


原因是node.js express.js服务器无法重新组织文件类型.wasm

所以它默认将响应头设置为application/octet流

通过以下方式启用express.js recognize.wasm文件:

更新类型为1.6.16版本+ 因为1.6.16添加了support.wasm文件

但如何让它起作用呢?分享我的工作示例:

1) 现在安装类型是,运行

      npm install type-is
确保package.json类型为version为1.6.18

2) 如果不是,请确保您的express.js版本为4.17 通过修改package.json文件将express.js从4.15更新到4.17, 如图所示,将4.15更改为4.17

然后跑 npm安装快车

4.15不支持类型为,因此必须升级到4.17

app.js文件添加日志,输出当前运行的express版本 只要确定是4点17分


现在,我的express.js support.wasm文件响应正确,标题内容类型为application/wasm

,但流式处理速度更快:(是吗?你有任何数据来支持这个论点吗?或者你只是依赖于一般的流媒体思想,即你可以在下载完成之前开始处理它?如果是这样的话,我不认为这会有什么显著的区别,除非你的wasm文件真的很大。首先,不管是哪种方式,你的“
then()
”代码只会在wasm文件完全下载后运行,因此唯一的好处是在浏览器端,在完全下载之前立即解析接收到的部分缓冲区。但是,我打赌,与其他瓶颈(网络、糟糕的用户代码等)相比,这种好处可以忽略不计@CarlSmith不确定您是否习惯Javascript,但这里暗示您必须在
async
函数中运行上面的代码。我将编辑答案以添加它,以防万一。@Lucio Palva-
async
wait
关键字是新的且非常高级的,因此我将不胜感激。谢谢。
Web server setup
To serve wasm in the most efficient way over the network, make sure your web server has the proper MIME time for .wasm files, which is application/wasm. That will allow streaming compilation, where the browser can start to compile code as it downloads.

In Apache, you can do this with

AddType application/wasm .wasm
Also make sure that gzip is enabled:

AddOutputFilterByType DEFLATE application/wasm
async function fetchAndInstantiate() {
    const response = await fetch("http://localhost:3000/simple.wasm");
    const buffer = await response.arrayBuffer();
    const obj = await WebAssembly.instantiate(buffer);
    console.log(obj.instance.exports.add(1, 2));  // "3"
}
      npm install type-is