如何将字符串var插入JSON?

时间:2016-05-09 19:07:34

标签: json node.js

我开始使用Node并且正在使用API​​。我试图采用一个String变量来代替JSON参数。

让我从代码开始,因为它会更有意义

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

    // An object of options to indicate where to post to
var post_options = {
    host: 'localhost',
    port: '8080',
    path: '/api/scan',
method: 'POST',
headers: {
    'Content-Type': 'application/json'
}
};

// Set up the request
var post_req = http.request(post_options, function(res) {
    res.setEncoding('utf8');
    var body = '';
    res.on('data', function (chunk) {
    body += chunk;
});
res.on('end', function () {
    body = JSON.parse(body)
    // Make sure it's working
    console.log(body.response.subject);
});
});

// post the data
var url = 'ssl.com';
post_req.write('{"url": ' + url + ', "path":"/", "port":"443", "live_scan":"false", "advanced":"true"}');
post_req.end();

如果查看最后三行,我试图将一个url设置为字符串var url,然后将其插入到JSON中。

这是我得到的错误:

$ node example.js
undefined:1
SyntaxError: Unexpected token s<br> &nbsp; &nbsp;at Object.parse (native)<br> &nbsp; &nbsp;at parse (C:\projects\ssl-scanner\node_modules\body-parser\lib\types\json.js:88:17)<br> &nbsp; &nbsp;at C:\projects\ssl-scanner\node_modules\body-parser\lib\read.js:116:18<br> &nbsp; &nbsp;at invokeCallback (C:\projects\ssl-scanner\node_modules\body-parser\node_modules\raw-body\index.js:262:16)<br> &nbsp; &nbsp;at done (C:\projects\ssl-scanner\node_modules\body-parser\node_modules\raw-body\index.js:251:7)<br> &nbsp; &nbsp;at IncomingMessage.onEnd (C:\projects\ssl-scanner\node_modules\body-parser\node_modules\raw-body\index.js:308:7)<br> &nbsp; &nbsp;at emitNone (events.js:80:13)<br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:179:7)<br> &nbsp; &nbsp;at endReadableNT (_stream_readable.js:913:12)<br> &nbsp; &nbsp;at _combinedTickCallback (node.js:377:13)
^

SyntaxError: Unexpected token S
at Object.parse (native)
at IncomingMessage.<anonymous> (C:\projects\node\example.js:23:21)
at emitNone (events.js:85:20)
at IncomingMessage.emit (events.js:179:7)
at endReadableNT (_stream_readable.js:913:12)
at _combinedTickCallback (node.js:377:13)
at process._tickCallback (node.js:401:11)

现在我这样做的原因是因为我想最终遍历一个包含URL列表的文本文件(每行一个,因为分隔符是新行)并设置{{1} }等于列表中的每个网址,然后发送请求。

欢迎任何想法和建议

-Hamza

2 个答案:

答案 0 :(得分:1)

很可能你没有从API获得JSON响应,而是HTML代码;可能的问题可能是您没有在请求中传递正确的JSON字符串。

使用JSON.stringify

var data = {
  'url': url,
  'path': '/',
  'port': 443,
  'live_scan': false,
  'advanced': true
};

post_req.write( JSON.stringify(data) );

此外,在尝试Content-Type之前,请检查您获得的响应中JSON.parse标头的设置。

答案 1 :(得分:0)

如果你看一下错误给你的回溯,问题是第23行。

在IncomingMessage上。的(C:\项目\节点\ example.js:23:21)

该行是:

body = JSON.parse(body)

我假设您打开的内容实际上不是JSON,所以当您尝试对其执行JSON.parse时,它会失败。看到错误也如何说:

Unexpected token s<br> &nbsp; &nbsp;

我们可以非常自信你的身体不是JSON。

尝试记录身体,看看它是什么。