首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nimlang:异步程序不编译

Nimlang:异步程序不编译
EN

Stack Overflow用户
提问于 2020-03-02 15:20:44
回答 1查看 479关注 0票数 0

我正在编写一个HTTP服务器,它发送HTTP请求并将内容返回给客户端。

以下是代码:

代码语言:javascript
复制
import asynchttpserver, asyncdispatch
import httpClient

let client = newHttpClient()

var server = newAsyncHttpServer()

proc cb(req: Request) {.async.} =

  let content = client.getContent("http://google.com")
  await req.respond(Http200, content)

waitFor server.serve(Port(8080), cb)

但是,我获得了以下编译错误消息(nim v1.0.0):

代码语言:javascript
复制
Error: type mismatch: got <AsyncHttpServer, Port, proc (req: Request): Future[system.void]{.locks: <unknown>.}>
but expected one of:
proc serve(server: AsyncHttpServer; port: Port;
          callback: proc (request: Request): Future[void] {.closure, gcsafe.};
          address = ""): owned(Future[void])
  first type mismatch at position: 3
  required type for callback: proc (request: Request): Future[system.void]{.closure, gcsafe.}
  but expression 'cb' is of type: proc (req: Request): Future[system.void]{.locks: <unknown>.}
  This expression is not GC-safe. Annotate the proc with {.gcsafe.} to get extended error information.

expression: serve(server, Port(8080), cb)

serve函数需要另一个表达式,但不知道如何修复它。令人惊讶的是,当我从服务器回调"cb“中删除HTTP请求时,代码编译得非常好。这是否意味着serve函数期望不同的回调表达式(取决于回调体)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-08 10:53:08

问题是,HttpClient是一个全局变量,用于回调函数"cb“。因此,回调函数不是GC安全的。

因此,在回调函数中实例化HttpClient就足够了:

代码语言:javascript
复制
import asynchttpserver, asyncdispatch
import httpClient



var server = newAsyncHttpServer()

proc cb(req: Request) {.async.} =

  let client = newHttpClient()

  let content = client.getContent("https://google.com")

  await req.respond(Http200, content)

waitFor server.serve(Port(8080), cb)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60491851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档