我可以在request.on(end)中response.end()吗?

时间:2018-02-06 11:16:05

标签: javascript node.js asynchronous

我正在学习node.js.我有一个客户端表单,我从中发送一些数据并以某种方式在模块 makeRequest 中重构它。该模块返回一个promise,我想通过响应客户端来解析它。 所以我可能会认为我可以这样做:

let post = '';

const server = http.createServer(function (req, res) {
    const readHtml = fs.createReadStream(__dirname + '/view/form.html', 'utf8');
    readHtml.pipe(res);
});

server.on('request', processPost);

function processPost(request, response) {
    let body = '';

    if (request.method === 'POST') {
        request.on('data', function (data) {
            body += data;

            if (body.length > 1e6) {
                request.connection.destroy();
            }
        });

        request.on('end', function () {
            post = JSON.parse(body);

            makeRequest(post.text)
                .then(data => {
                    response.end(data);
                })
                .catch(err => {
                    console.log(err);
                });
        });
    }
}

server.listen(3000, 'localhost');

这对我来说意味着只要我检索重构数据,我立即将它发送回客户端,并返回response.end(data)。 但是,如果我这样做,突然数据不会返回给客户端。如果我在request.on('end')之后写了response.end(data),它确实如此。但这是同步方式,因此当我运行这样的代码时,无论如何都不会有数据。

我能做些什么让它按照我想要的方式工作?

1 个答案:

答案 0 :(得分:0)

如果在下面的问题讨论中说,您只想在浏览器中访问默认页面,请将其设为条件

const server = http.createServer(function(req, res) {
  if ( req.method == "GET" ) {
    const readHtml = fs.createReadStream(__dirname + '/view/form.html', 'utf8');
    readHtml.pipe(res);    
  }
});

这样可以正确处理GET和POST。

我的建议是使用任何框架更有条理的方法,Express应该没问题。这样,您可以更清晰地定义不同的路由和请求类型。