【问题标题】:Nodejs server generates input form before parsing previous inputNodejs 服务器在解析之前的输入之前生成输入表单
【发布时间】:2016-05-15 13:43:08
【问题描述】:

我有这个代码 sn-p。

function handleRequest(req, res)
{
    req.on('data', parseInput);
    res.write(generateInputform());
}

http.createServer(handleRequest).listen(port, ipAddress);

req.on 回调 parseInput 并按字面意思执行函数的调用,它解析输入并设置引脚等。然后生成另一个输入表单并呈现给用户。

然而,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;
        }
}

编辑:

在这里找到答案。 Make a blocking call to a function in Node.js required in this case?

新的句柄请求

req.on('data', parseInput);
req.on('end', function()
{
    res.write(generateInputform());
    console.log("Done");
    res.end();
});

【问题讨论】:

    标签: javascript node.js server iot intel-edison


    【解决方案1】:

    这是因为 Node.js(和 javascript)异步运行而不是同步运行,因为您可能使用其他语言。这意味着当一个线程在后台执行 I/O 操作时,主线程被允许运行。因此,在您的情况下,“generateInputform()”是在输入仍在解析时执行的。

    您的问题的解决方案是使用回调。 我建议你阅读这个教程来理解这个概念:http://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm

    【讨论】:

    • 我有点理解这个想法,但我不确定如何应用回调而不需要重写很多。这是否意味着我必须回调 generateInputform、res.write 和 res.end 才能使其工作?
    【解决方案2】:

    您只是定义req 对象接收数据时会发生什么:

    req.on("data", parseInput);
    

    这是直接执行的:

    res.write(generateInputform());
    

    generateInput 可能需要进入parseInput

    【讨论】:

    • 我认为嵌套代码是不必要的。不过可能是错的。
    • 枪,我更新主帖的时间太长了...我添加了完整的功能。重点是,在switch case中,这两条命令只有在req接收到数据时才能执行。或者,至少应该是,除非我读错了。
    【解决方案3】:

    您仍然在说“当您收到数据时,执行此操作”,然后是“现在执行此操作”。 “now do that”将直接执行,而第一个仅表示它正在等待数据。您将收到数据的事件发生在很久以后,可能在下一个循环中。 (不知道节点是如何做到的)

    【讨论】:

    • 一小时前我是user6337248 :p
    • Imo 它不应该因为它必须有数据,即使它到达那里。但是,好吧,这似乎比预期的要容易得多。我有一种预感,解决方案非常简单。
    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2021-10-29
    • 2021-03-14
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多