Node JS:监听HTTPS POST JSON请求

时间:2014-05-29 17:29:25

标签: javascript node.js post express https

我目前有一个网络服务器,它将信息作为JSON有效负载发布给特定的URL端点。

规范声明我需要站起来一个可以监听POST JSON请求的HTTPS服务器。

我创建了如下所示的简单Node JS监听器。

我可以确认请求正在命中端点,但是在记录时,似乎是乱码数据。有人可以告诉我,如果我在脚本中缺少一个阻止JSON解码正确发生的参数吗?

var express = require('express');
var http = require('http');
var https = require('https');
var fs = require('fs');
var logger = require('logger');
var bodyParserNew = require('body-parser');
var application_root = __dirname;
var path = require("path");
var util = require('util');

var options = {
  key: fs.readFileSync('./privatekey.pem'),
  cert: fs.readFileSync('./server.crt')
};

var app = express();

app.set('port', process.env.PORT);
app.use(express.static(path.join(__dirname, 'site')));

//listener
app.post('/api/test', function (req, res) {
    var body = '';
    req.on('data', function (data) {
        body += data;
    });
    req.on('end', function () {
        console.log('/api/test');
        console.log(req.body);
    }); 

    res.writeHead(200);
    res.end();
});

https.createServer(options,app).listen(8080);
console.log('listening on server 8080');

我看到的有效负载片段:

��Qk�0��R��ْ,K��1$e!Y�Ä��2�����b��n)�e�7��:�ü�F7V���-
�?�3���G��� �
                 9���=#�4��hhv���k��Y�0�%Øq&�mÄ7�i�A�C>��A???h,�����1�5�����2Äe�<�?�����Q��

2 个答案:

答案 0 :(得分:1)

尝试在res.writeHead(200); res.end();回调中移动req.on('end'),否则您会在等待请求数据之前立即发送回复。

此外,您不需要手动缓冲请求数据。在路由上方添加app.use(bodyParserNew.json());将为您执行此操作并提供包含已解析结果的req.body。如果需要,您还可以设置一些bodyParser.json() options

答案 1 :(得分:0)

我试过你的例子,这在我的情况下运作得很好。在你的例子中,req.body应该只是正文。像mscdex说的那样,你可以使用中间件为你解析json。在这里你有适合我的代码(它几乎与你的相同):

var fs = require('fs');
var express = require('express');

var app = express();

var options = {
    key: fs.readFileSync('./key.pem'),
    cert: fs.readFileSync('./cert.pem')
};


//listener
app.post('/api/test', function (req, res) {
    var body = '';
    req.on('data', function (data) {
        body += data;
    });
    req.on('end', function () {
        console.log('/api/test');
        console.log(body);
    });

    res.writeHead(200);
    res.end();
});

var https = require('https');
https.createServer(options, app).listen(443);