Nodejs服务器在解析之前生成输入表单

Nodejs server generates input form before parsing previous input

本文关键字:输入 表单 服务器 Nodejs      更新时间:2023-09-26

我有这个代码片段。

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"将直接执行,而第一个仅表示它正在等待数据。您将接收数据的事件发生在很久以后,可能在下一个循环中。(不知道节点是如何做到的)