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

标签 javascript node.js server iot intel-edison

我有这个代码片段。

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

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

req.on 回调 parseInput 并执行该函数所调用的操作,它解析输入并设置引脚等。然后,生成另一个输入表单并将其呈现给用户。

但是,node.js 首先生成输入,然后解析输入...这意味着用户必须刷新页面才能反射(reflect)给定的命令。解析输入有效,我可以使用逻辑分析器看到引脚在提交时切换。

我似乎陷入了困境,因为我找不到这个答案的简单解决方案。那些表现出希望的处理异步延迟,我宁愿避免。

也许有人可以阐明这个问题?

这是完整的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?

新的handleRequest

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

最佳答案

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

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

关于javascript - Nodejs 服务器在解析之前的输入之前生成输入表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37239015/

相关文章:

linux - 编译源代码并作为 cron 作业运行

c - 如何在 Client.c 中使用文件作为参数

javascript - 2 表单中字段的名称属性

php - 如何在CakePHP中保存日期时间格式(将日期从JS传递给CakePHP)

javascript - 在服务器客户端连接之前如何获取IP地址(使用websockets/ws)?

windows - 更改 cookie 文件后 RabbitMQ 节点身份验证失败

javascript - Gulp Watch Concat 有时会忽略一些 JS 文件

javascript - 可拖动效果第二次不显示

node.js - 将数组值附加到 csv

node.js - 如何使用 Azure 函数绑定(bind)发送计划的服务总线队列消息?