从NodeJS到Node / Express的安全POST请求挂起

时间:2014-03-23 18:55:01

标签: javascript node.js express https

我正在使用以下内容将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服务器中,这些是适当的片段:

档案: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后,我从客户端运行main.js(Windows 7)。 req.write和req.end执行和“完成请求”日志到控制台,但请求回调永远不会触发。

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

我知道我遗漏了一些简单的东西,但我已经阅读了几十个编码示例,你可以从我的代码片段收集,我已经尝试了我能找到或想到的一切。我猜这个请求没有完成,但我不知道为什么。让“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);
   };
};

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

  

POST / saveconfig

     

保存配置

     

[因为无限循环而没有]

相反,我得到了:

  

保存配置

     不推荐使用

connections属性。使用getConnections()方法

作为JavaScript新手,我认为请求,服务器或其间的一些管道有问题。当然,我添加的调试代码(以及我对JS的无知)加剧了这个问题。

更改

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

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

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

1 个答案:

答案 0 :(得分: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);

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