2015-04-21 1 views
4

Я полный noob в node.js и пытаюсь изучить его с помощью learnyounode. Я застрял в последней проблеме learnyounode - [HTTP JSON API SERVER].
В этом учебнике вызывается URL-адрес для предоставления времени (как iso standard), а сервер node.js должен возвращать ответ json в (k, v), где пара будет k = {«час», «минута», «второй»}.Возвращение строки кодировки JSON от node.js

Мое решение выглядит ниже -

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]); 

Но решение не работает правильно, потому что JSON.stringify() возвращается пустой [] строку. Что мне здесь не хватает?

Выход текущего решения по:

[ hour: 7, minute: 27, second: 38 ] 
[] 
[] 
[] 
[ hour: 7, minute: 27, second: 38 ] 
[] 
+0

Что у вас есть в 'cur_url ['query'] ['iso']'? – Lewis

+0

Можете ли вы создать скрипку pls. – marcel

+2

Попробуйте результат = {} вместо = [] – CFrei

ответ

4
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; 
}

Вы инициализацией result как массив, но рассматривая его как объект. JavaScript принимает это, вроде, но JSON не делает - массив - это массив, объект - это объект.

Если вы инициализируете его как объект (var result = {};), JSON узнает его свойства и распечатает их. Как бы то ни было, JSON видит только пустой массив.

+0

Хммм, я этого не знал ... :). Он делает трюк – fadedreamz

+0

на самом деле я знал это неправильно, я думал, что JSON работает с картами (k, v), но по вашему комментарию кажется, что он работает с объектами (имя-свойство, значение) – fadedreamz

3

Я изменил некоторые места.

function get_json(str) { 
    str = new Date(str).toLocaleTimeString(); 

    var arr = str.split(":"); 

    var result = {}; 
    result['hour'] = +arr[0]; 
    result['minute'] = +arr[1]; 
    result['second'] = +arr[2]; 

    return result; 
} 

function get_unix(str) { 
    return {"unixtime": +(new Date(str))}; 
} 

+ преобразует строку в INT

+0

намного чище и удобочитаемо, чем мое решение. ty ^^ – fadedreamz

Смежные вопросы