【问题标题】:http.createServer on('request') async/await functionshttp.createServer on('request') async/await 函数
【发布时间】:2023-03-26 18:20:01
【问题描述】:

尝试在来自 node.js http.createServer 的请求事件中使用异步函数。我想使用 vanilla node.js 模块。 我知道我可以使用外部依赖项,但希望在没有理想情况下解决。

我不明白为什么我从 console.logs 中看到的异步函数取回数据,但 curl resp 不包含它。我没有收到任何错误,比如在 resp 发回后写标题很困惑为什么 curl 没有 { data: 1 } 的正文。如果我删除 async/await 并将 req.end 硬编码为“测试”,它会在 curl 请求中返回。

server.js

const server = http.createServer();
server.on('request', async (req, res) => {
  const data = await someAsyncFunc();
  console.log(req.url);
  console.log(data);
  res.end(JSON.stringify(data));
});

终端

curl localhost:3000/test -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /test HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/plain; charset=utf-8
< Content-Length: 9
< Date: Tue, 17 Apr 2018 18:44:00 GMT
< Connection: keep-alive
<
* Connection #0 to host localhost left intact
Not Found%

server.js 日志

/test
{ data: 1 }

----- 更新 ------

似乎这个问题的原因是我将 koa app.callback() 传递给 createServer,这似乎破坏了 http 服务器请求事件中的异步内容:

const app = new Koa();
http.createServer(app.callback());

我更喜欢使用 server.on('request') 但我可以让它工作的唯一方法是使用 koa 中间件。

【问题讨论】:

  • 什么是someAsyncFunc?您正在将 that 的结果打印到控制台,它不是来自请求
  • 也许你应该在结束前写下响应头:res.writeHead(200, {"Content-Type": "your content MIME"})(代码200表示OK)
  • 看起来服务器没有这样的路由GET /test,甚至在你的代码执行之前你就得到了 404...
  • ...如果someAsyncFunc 花费很长时间,客户端可能会收到连接超时错误。
  • 只要someAsyncFunc() 返回一个可以解析为您的值的承诺,server.js 中的代码就可以找到。真的是这样吗?也许您应该向我们展示someAsyncFunction() 的代码,因为这就是更有趣的事情发生的地方。

标签: javascript node.js http async-await


【解决方案1】:

我无法重现您的问题。

我发布这个作为答案只是为了与您分享我用来尝试重现您的问题的确切代码,以向您展示什么对我有用。

您的实际代码中一定有与此不同的内容导致错误,或者您的 curl 请求实际上并未连接到您认为的服务器。您必须与我们分享更多信息,以便我们能够提供进一步帮助。您在问题中显示的代码不是问题。这是我使用的对我来说效果很好的东西:

const http = require('http');

const server = http.createServer();
server.on('request', async (req, res) => {
  const data = await someAsyncFunc();
  console.log(req.url);
  console.log(data);
  res.end(JSON.stringify(data));
});

function someAsyncFunc() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve({data: 1});
        }, 1000);
    });
}

server.listen(3000);

然后,我得到这个输出:

curl localhost:3000/test -v
*   Trying ::1...
* TCP_NODELAY set
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /test HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.59.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 17 Apr 2018 23:53:32 GMT
< Connection: keep-alive
< Content-Length: 10
<
{"data":1}* Connection #0 to host localhost left intact

【讨论】:

  • 所以我确实在做一些稍微不同的事情。我有一个 koa 应用程序,并且正在将 app.callback() 传递给 createServer。我有这样做的理由,但似乎这就是导致异步请求无法正常工作的原因。
猜你喜欢
  • 2018-12-23
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2017-12-17
  • 2016-01-22
  • 2020-08-01
相关资源
最近更新 更多