【问题标题】:Deno serve imported from std/http/server.ts is not async iterable?从 std/http/server.ts 导入的 Deno 服务不是异步可迭代的?
【发布时间】:2022-02-04 05:47:13
【问题描述】:

这是我的 .js 文件的全部内容:

import { serve } from "https://deno.land/std/http/server.ts"

let server = serve({ port: 4000 })
for await (const req of server){
  console.log('literally anything')
}

我使用的完全是代码,我已经看到其他多个人运行时没有问题,而且我自己之前在同一台机器上运行过类似的 for 循环。我不明白我破坏了什么,或者如果我导入了错误的东西,我不知道什么是正确的。我在本地 Deno 版本 1.18.1 上,路径是我从 deno.land 站点获得的路径,当我在该代码上尝试 deno run --allow-net 时得到的错误是:

错误:未捕获的类型错误:服务器不是异步可迭代
for await(服务器的 const req){ 在 file:///H:/proj/testapp/serveHTTP.js:4:25

【问题讨论】:

    标签: deno


    【解决方案1】:

    serve 的返回类型 曾经是 Server(这是异步可迭代的)直到std 版本0.106.0:这里是a link 到那个版本的serve .这可能就是您看到使用这种方式的示例的原因。

    std 的版本0.107.0 开始,serve 的签名changed 改为接受Handler(并返回Promise<void>)。

    这是a link 到当前版本serve(来自std@0.123.0)的文档,下面是一个如何使用它的示例:

    so-70963882.ts:

    import { serve } from "https://deno.land/std@0.123.0/http/server.ts";
    
    function requestHandler (request: Request): Response {
      const data = {
        url: request.url,
        headers: Object.fromEntries([...request.headers].sort()),
      };
    
      console.log(data);
      const body: BodyInit = JSON.stringify(data, null, 2);
      const headers = new Headers([['content-type', 'application/json']]);
      const init: ResponseInit = {headers};
      return new Response(body, init);
    }
    
    const ac = new AbortController();
    serve(requestHandler, { port: 4000, signal: ac.signal });
    
    const responseText = await (await fetch('http://localhost:4000')).text();
    console.log(responseText);
    ac.abort();
    
    

    在控制台中:

    deno run --allow-net ./so-70963882.ts
    {
      url: "http://localhost:4000/",
      headers: {
        accept: "*/*",
        "accept-encoding": "gzip, br",
        host: "localhost:4000",
        "user-agent": "Deno/1.18.1"
      }
    }
    {
      "url": "http://localhost:4000/",
      "headers": {
        "accept": "*/*",
        "accept-encoding": "gzip, br",
        "host": "localhost:4000",
        "user-agent": "Deno/1.18.1"
      }
    }
    
    

    对于导入的模块,您应该始终使用版本化的 URL——它们更有可能“不可变”(提供幂等响应)。

    【讨论】:

    • 不是这样的。它也在一个新文件中执行此操作,并且错误是相同的,即使我指定 std 的 v 0.123.0:i.imgur.com/DHYEQtN.png 我也希望这也是一个缓存问题,只是不知道如何工作用它。还有其他想法吗? :l
    • @domi 我更新了我的答案。这对你有用吗?
    • 我很感激。我有一些非常相似的工作,最近我用第三个 pty 工具 Abc 的实现取代了它,因为它更简洁和可读。因此,无论哪种方式,这项工作都已完成,但我试图得到的是,服务导入不能用作我端的异步迭代。老实说,我认为导致错误的任何原因都必须在我的 Deno 版本中,而不是在我的代码中。这对其他人来说似乎不是问题。但我不能将这种 for 循环用作侦听器。由于我的本地版本已更新,我只是没有想法。
    • @domi 我再次更新了我的答案,以进一步解释serve的函数签名在版本之间是如何变化的。
    • 感谢您的澄清!知道这不是我以某种方式创造的本地问题,我松了一口气。上一次我使用速记循环时,我一定一直在使用版本化导入。感谢您花时间解释!
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多