我正在使用以下内容将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);
并删除无限循环解决了问题。
答案 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
。