Nodejs服务器在解析之前生成输入表单
Nodejs server generates input form before parsing previous input
我有这个代码片段。
function handleRequest(req, res)
{
req.on('data', parseInput);
res.write(generateInputform());
}
http.createServer(handleRequest).listen(port, ipAddress);
req.on调用parseInput并执行函数的调用,它解析输入并设置pin等。然后,生成另一个输入表单并将其呈现给用户。
然而,node.js首先生成输入,然后解析输入。。。这意味着用户必须刷新页面以反映给定的命令。分析输入工作,我可以看到引脚切换提交与我的逻辑分析器。
我似乎墨守成规,因为我找不到一个简单的答案。那些显示出希望的处理异步延迟,我宁愿避免这种延迟。
也许有人能阐明这个问题?
这是完整的handleRequest。
function handleRequest(req, res)
{
switch( req.url )
{
case "/markings.css" :
res.writeHead(200, {'Content-Type': 'text/css'});
res.end("Literally nothing right now");
break;
case "/json" :
res.writeHead(200, {'Content-Type': 'text/json'});
res.end(encapsulator(J17_1, J18_1, J19_14, J20_14));
break;
case "/index":
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(getHTML());
break;
case "/":
// show the user a simple form
console.log("[200] " + req.method + " to " + req.url);
res.writeHead(200, "OK", {'Content-Type': 'text/html'});
switch( req.method )
{
case 'POST':
//Problems between here
req.on('data', parseInput);
res.write(generateInputform());
//And here
console.log("Done");
res.end();
break;
case 'GET':
console.log("User probably refreshed page without entering anything useful");
res.write(generateInputform());
console.log("Done");
res.end();
break;
default:
console.log("?");
res.end();
break;
}
//res.end();
break;
default:
res.writeHead(404, {'Content-Type': 'text/html'});
res.end('<!DOCTYPE html>'r'n<html>'r'n<body>'r'n404, that means trouble.<br><a href="http://' +
ipAddress + ':' + port + '">Go back to the index</a></body></html>');
break;
}
}
编辑:
答案在这里。在这种情况下,是否需要对Node.js中的函数进行阻塞调用?
新手柄请求
req.on('data', parseInput);
req.on('end', function()
{
res.write(generateInputform());
console.log("Done");
res.end();
});
这是因为Node.js(和javascript)异步运行,而不是同步运行,因为您可能与其他语言一起使用。这意味着当线程在后台执行I/O操作时,允许主线程运行。因此,在您的情况下,"generateInput()"是在输入仍在解析时执行的。
解决问题的方法是使用回调。我建议你阅读本教程来理解这个概念:http://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm
您只是在定义req
对象接收数据时会发生什么:
req.on("data", parseInput);
这是直接执行的:
res.write(generateInputform());
CCD_ 2可能需要进入CCD_ 3内部。
您仍然在说"当您收到数据时,做这个",然后是"现在做那个"。"nowdothat"将直接执行,而第一个仅表示它正在等待数据。您将接收数据的事件发生在很久以后,可能在下一个循环中。(不知道节点是如何做到的)
相关文章:
- Nodejs服务器在解析之前生成输入表单
- 如何创建打开警报框的输入表单
- JavaScript onChange 事件侦听器对输入表单不起作用
- 如何在 OnKeyPress 事件后获取输入表单元素的值
- 单输入表单 - 特殊情况 |停止表单提交
- 需要输入表单验证
- 如何在谷歌图表中使用输入表单值
- 使用jquery可交换地更改两个html输入表单值
- 当从jqueryajax调用输入表单时,它不起作用
- 控制器作为搜索输入表单的语法
- 删除带有按钮的输入表单失败
- 验证带有2个小数点的浮点形式的输入表单
- AngularJS:输入表单在分部中不起作用
- 如何从php中的输入表单调用Javascript函数,以更改HTML
- 输入表单中的Sharepoint javascript
- 当点击输入表单时,为Raphael制作的对象添加光晕
- 当用户将数据输入表单时要知道的事件
- 保存输入表单后ImageMap颜色更改
- 链接输入表单中的填充脚本
- 有关多个输入表单验证的问题