【发布时间】: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