I am a complete noob in node.js and trying to learn it by using learnyounode. I am stuck at the last problem of the learnyounode -
[HTTP JSON API SERVER].
Here the tutorial will call a url to provide a time (as iso standard) and the node.js server should return the json reply in (k,v) where pair will be k = { "hour", "minute", "second" }.
My solution goes like below -
var http = require('http');
var url = require('url');
function get_json(str) {
var result = [];
str = str.substr(str.lastIndexOf('T') + 1);
result['hour'] = Number(str.substring(0, str.indexOf(':')));
str = str.substring(str.indexOf(':') + 1);
result['minute'] = Number(str.substring(0, str.indexOf(':')));
str = str.substring(str.indexOf(':') + 1);
result['second'] = Number(str.substring(0, str.indexOf('.')));
return result;
}
function get_unix(str) {
var result = get_json(str);
result['unix'] = ((result['hour'] * 3600000) +
(result['min'] * 60000) + (result['sec'] * 1000));
return result;
}
var server = http.createServer(function (req, res) {
if (req.method != 'GET') {
return res.write('{ "error": "query-failed" }');
}
var cur_url = url.parse(req.url, true);
if (cur_url['pathname'] == '/api/parsetime') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(JSON.stringify(get_json(cur_url['query']['iso'])));
} else if (cur_url['pathname'] == '/api/unixtime') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(JSON.stringify(get_unix(cur_url['query']['iso'])));
}
console.log(get_json(cur_url['query']['iso']));
console.log(JSON.stringify(get_json(cur_url['query']['iso'])));
res.end();
});
server.listen(process.argv[2]);
But the solution is not working correctly because JSON.stringify()
is returning empty [] string. What am I missing here?
Current Solution's Output:
[ hour: 7, minute: 27, second: 38 ]
[]
[]
[]
[ hour: 7, minute: 27, second: 38 ]
[]
function get_json(str) {
var result = [];
str = str.substr(str.lastIndexOf('T') + 1);
result['hour'] = Number(str.substring(0, str.indexOf(':')));
str = str.substring(str.indexOf(':') + 1);
result['minute'] = Number(str.substring(0, str.indexOf(':')));
str = str.substring(str.indexOf(':') + 1);
result['second'] = Number(str.substring(0, str.indexOf('.')));
return result;
}
You are initializing result
as an array, but treating it as an object. JavaScript accepts this, sort of, but JSON doesn't -- an array is an array, an object is an object.
If you initialize it as an object (var result = {};
), JSON will recognize its properties and print them. As it is, JSON only sees an empty array.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With