【问题标题】:Nodejs page freezes after multple requests to Custom API多次请求自定义 API 后,Nodejs 页面冻结
【发布时间】:2016-07-03 14:11:07
【问题描述】:

我遇到的问题是,当我多次按下提交按钮时我的应用程序只提交一个 1 时它会冻结,并且在一段时间(大约 1000.000 毫秒)后它会返回控制台和玉页面中的最后一个请求。提交按钮从表单返回一个帖子并将其发送到同一页面。该按钮还可以刷新页面。重要的是页面将(JSON)帖子返回到页面,并且有另一个 json 请求将其发送到 API(并将其返回到同一页面)

app.js

var options_search = {
    hostname: 'host',
    path: 'path',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': JSON request .length,
    }
};

app.post('/result',function(req,response){

    var keyword=req.body.user;


    GLOBAL.objToJson ={ keyword };
    response.write(JSON.stringify(GLOBAL.objToJson));

    console.log("test " +JSON.stringify(GLOBAL.objToJson) );

});



app.get('/Search', function(req, res) {

    var req = http.request(options_search,  (resb) => {

        var buffer_search = "";
        resb.setEncoding('utf8');

        resb.on('data', (chunks) => {
            buffer_search += chunks;
        });
        resb.on('end', () => {

            res.render('Search',{
                title: 'Search',
                value_search: buffer_search,
                search_test: [JSON.stringify(GLOBAL.objToJson) ]
            });
        });
       });

    //res.redirect("/search");
    req.write(search);

});

搜索.玉

doctype html
html
    head
    script(src='//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js')
    script.
        $(document).ready(function(){
            var user,pass;
            $("#submit").click(function(){
                user=$("#user").val();
                pass=$("#password").val();
                $.post("http://localhost:3000/result",{user: user}, function(data){
                    if(data==='done')
                    {
                        alert("login success");
                    }

                });


            });
        });


        input#user(type='TEXT', size='40')
        br
        input#submit(type='button', value='Submit',onclick="location.href='search'")

【问题讨论】:

    标签: json node.js api express pug


    【解决方案1】:

    result 路由中,您使用底层HTTP .write() 方法来响应客户端。然而,这并没有结束连接,它会保持打开状态,期待更多的东西被写入客户端。

    如果您要发送字符串,则应使用.send(),因为这会将字符串写入 HTTP 流并结束响应。

    您可能还想考虑不将对象字符串化为 JSON 字符串,而只使用 .json()。所以这行代码

    response.write(JSON.stringify(GLOBAL.objToJson));
    

    变成

    response.json(GLOBAL.objToJson);
    

    【讨论】:

    • 我为什么要考虑它们之间有什么区别?
    • 如果您不结束响应(在调用 write() 后调用 response.end(),或使用 .send().json() 或任何其他结束响应的函数)你)然后连接将保持打开状态并且不完整。最终 express 将超时,但与此同时,您有一个开放的连接,客户端正在等待完成。
    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2014-12-12
    相关资源
    最近更新 更多