http.createServer on('request')async / await functions

时间:2018-04-17 18:59:12

标签: javascript node.js http async-await

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

我无法理解为什么我从console.logs中看到异步函数返回数据,但curl resp不包含它。我没有收到任何错误,比如在resp被发送回来后写标题这么混淆为什么curl没有{ data: 1 }的主体。如果我删除async / await并将req.end硬编码为'test',则返回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 log

/test
{ data: 1 }

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

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

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

我本来希望使用server.on('request'),但我能让它工作的唯一方法就是使用koa中间件。

1 个答案:

答案 0 :(得分:3)

我无法重现您的问题。

我发布此答案只是为了与您分享我曾经尝试重现您的问题的确切代码,以向您展示对我来说没问题。

实际代码中必定存在与此不同的内容,导致错误或您的卷曲请求实际上并未连接到您认为的服务器。您将不得不与我们分享更多信息,以便我们进一步提供帮助。您在问题中显示的代码不是问题。以下是我使用的对我来说很好的方法:

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