我正在编写一个HTTP服务器,它发送HTTP请求并将内容返回给客户端。
以下是代码:
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):
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函数期望不同的回调表达式(取决于回调体)?
发布于 2020-03-08 10:53:08
问题是,HttpClient是一个全局变量,用于回调函数"cb“。因此,回调函数不是GC安全的。
因此,在回调函数中实例化HttpClient就足够了:
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)https://stackoverflow.com/questions/60491851
复制相似问题