【问题标题】:Can I response.end() inside request.on(end)?我可以在 request.on(end) 中 response.end() 吗?
【发布时间】:2018-02-06 11:16:05
【问题描述】:

我正在学习 node.js。我有一个客户端表单,我从该表单向我的服务器发送一些数据并在模块 makeRequest 中以某种方式对其进行重构。该模块返回一个承诺,我想通过对客户端的响应来解决它。 所以我可能认为我可以这样做:

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),它确实如此。但这是同步方式,因此当我运行这样的代码时,无论如何都不会有数据。

我该怎么做才能让它按我的意愿工作?

【问题讨论】:

  • 不确定您想要做什么,但请查看您的http.createServer 调用,其中您无条件 将静态文件通过管道传输到客户端,而不管请求类型如何。因此,即使在POST 请求中,客户端也会获取文件的内容。您以后拥有的内容并没有太大变化,或者更确切地说 - 混淆了运行时 - 您不仅通过管道传输静态文件,而且还尝试返回 另一个 响应。例如,如果您调用http.createServer 没有任何参数,您的POST 处理将正常工作。但是,正如我所说,我不确定你在做什么。
  • readHtml.pipe(res) 是这样的,所以当我打开 localhost:3000 时,html 表单就会在那里。也许还有其他方法可以获取该页面?
  • 是的,在作为请求处理程序附加的函数内有一个if。我会在一分钟内给出答案。

标签: javascript node.js asynchronous


【解决方案1】:

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

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 应该可以。这样您就可以更简洁地定义不同的路由和请求类型。

【讨论】:

  • 很高兴听到这个消息,如果能接受这个答案就好了。
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多