【问题标题】:Secure POST request from NodeJS to Node/Express hangs从 NodeJS 到 Node/Express 的安全 POST 请求挂起
【发布时间】:2014-04-30 23:42:00
【问题描述】:

我正在使用以下内容将 POST 数据发送到安全的 nodejs 服务器:

文件:main.js

    var strdata = JSON.stringify({"data":"thisdata"});

    var options = {
        host: '192.168.1.63',
        port: 3001,
        path: '/saveconfig',
        method: 'POST',
        rejectUnauthorized: false,
        requestCert: true,
        agent: false,
        
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': Buffer.byteLength(strdata)
        }   
        
    };

    
    var req = https.request(options, function(res) {
        console.log('STATUS: ' + res.statusCode);
        console.log('HEADERS: ' + JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            console.log('BODY: ' + chunk);
        });
    });
    
    console.log(req.write(strdata));
    console.log(req.end());

    req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
    });

    req.on('finish', function() {
        console.log("finished request");
    });

在其他功能正常的 expressjs 服务器中,这些是适当的 sn-ps:

文件:app.js

app.post('/saveconfig', function() { 
    data.saveconfig; console.log("received request"); } );

app.get('/getconfig', data.getconfig);

文件:data.js

exports.saveconfig = function(req, res) {
console.log("saveing config");
        
res.send(200);
res.end();

};

exports.getconfig = function(req, res) {
res.send("get OK");
}

通过在服务器 (Ubuntu) 上运行 app.js,我从客户端 (Windows 7) 运行 main.js。 req.write 和 req.end 执行和“完成请求”记录到控制台,但请求回调永远不会触发。

在 app.js 中的服务器上,app.post 事件触发并将“收到的请求”记录到控制台。但是“保存配置”永远不会登录到控制台。只有在我杀死 (^C) main.js 之后,express 然后登录到控制台“POST /saveconfig”。

我知道我遗漏了一些简单的东西,但我已经阅读了几十个编码示例,你可能会从我的 sn-p 中收集到,我已经尝试了我能找到或想到的一切。我猜这个请求没有完成,但我不知道为什么。触发“exports.saveconfig”缺少什么?

附加信息

下面发布的答案解决了我的问题。因为我是 stackoverflow 的新手,所以我无法发布自己的答案,但这是故事的其余部分......

感谢您的帮助。作为 JavaScript 的新手,我发现我可以通过将对象转换为字符串来了解很多关于对象的知识。我最初试图将 req 参数转换为字符串使用自定义函数。我刚刚发现它显然在使用 JSON.stringify 之后陷入了无限循环。

代码看起来像这样:

exports.saveconfig = function (db) {
    return function(req, res) {
        console.log("saving config");
    
        console.log(mymodule.serialize(req));
    
        res.end("OK");
    
        console.log(req.body);
   };
};

我原以为上面的代码应该将以下内容记录到控制台——即使序列化方法处于无限循环中:

POST /saveconfig

保存配置

[没有死循环]

相反,我得到了:

保存配置

connections 属性已弃用。使用 getConnections() 方法

作为 JavaScript 新手,我认为请求、服务器或中间的某些管道有问题。当然,然后我添加的调试代码(以及我对 JS 的无知)使问题更加复杂。

变化

app.post('/saveconfig', function() { 
data.saveconfig; console.log("received request"); } );

app.post('/saveconfig', datarts.saveconfig);

并删除无限循环解决了问题。

【问题讨论】:

    标签: javascript node.js express https


    【解决方案1】:

    问题在于你是 app.js。您在回调中使用 data.saveConfig 而不调用它。正确的方法是

    app.post('/saveconfig', function(req,res) { 
        data.saveconfig(req, res); 
        console.log("received request"); 
    });
    
    app.get('/getconfig', data.getconfig);
    

    或(我假设console.log 仅用于调试目的):

    app.post('/saveconfig', data.saveconfig);
    
    app.get('/getconfig', data.getconfig);
    

    如果您想使用第二个示例,可以在您的 data.saveconfig 方法中执行您的 console.log()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2022-11-07
      • 2022-01-25
      • 1970-01-01
      • 2019-06-26
      • 2019-07-23
      • 1970-01-01
      相关资源
      最近更新 更多