JSON+Node.js - Unexpected token o

49,754

Solution 1

Your colleges variable is already a valid JavaScript Object. You do not have to use JSON.parse on it.

JSON.parse expects a String as first argument, but you provide an Object. Thus it is coerced to a String looking like the one you see in the Error message.

For the rest of your code, you might want to take a look at Express or Zappa to be able to write the code a bit more compact ;)

Solution 2

the solution is to use JSON.stringify as follows

var target=JSON.parse(JSON.stringify(source));
Share:
49,754
Daniel
Author by

Daniel

Updated on July 07, 2020

Comments

  • Daniel
    Daniel almost 4 years

    I just started working with node.js and json objects in my college course. One of our assignments this week was to create a few json objects and extract parts of the object into an html page. I thought I had a good grasp on how to do this, but I am running into an error when I try to start node. If I remove the colleges object and the parse statement then node runs fine.

    Here is the error I get when I run "node index.js":

    undefined:1
    [object Object],[object Object],[object Object],[object Object],[object Object
     ^
    SyntaxError: Unexpected token o
    at Object.parse (native)
    at Object.<anonymous> (/home/ubuntu/node_stuff/node_json/requestHandlers.js:13:20)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/home/ubuntu/node_stuff/node_json/index.js:3:23)
    at Module._compile (module.js:449:26)
    

    And here is the code I am working with.

    var querystring = require("querystring"),
    fs = require("fs"),
    formidable = require("formidable");
    
    var colleges = [
    {"name":"A-B Tech","street":"340 Victoria Road","city":"Asheville","state":"NC","zip":"28801","phone":"828-254-1921"},
    {"name":"UNC Asheville","street":"1 University Heights","city":"Asheville","state":"NC","zip":"28804","phone":"828-251-6600"},
    {"name":"UNC Charlotte","street":"9201 University City Blvd","city":"Charlotte","state":"NC","zip":"28223","phone":"704-687-8622"},
    {"name":"Western Carolina","street":"North Carolina 107","city":"Cullowhee","state":"NC","zip":"28723","phone":"877-928-4968"},
    {"name":"NC State","street":"2200 Hillsborough","city":"Raleigh","state":"NC","zip":"27695","phone":"919-515-2011"}
    ];
    
    var college = JSON.parse(colleges);
    
    function abtech(response) {
    console.log("Request handler 'abtech' was called.");
    
    var body = '<html>'+
    '<head>'+
    '<meta http-equiv="Content-Type" '+
    'content="text/html; charset=UTF-8" />'+
    '</head>'+
    '<body>'+
    '<ul>'+
    '<li>' + college[0].name + '</li>'+
    '<li>' + college[0].street + '</li>'+
    '<li>' + college[0].city + ' ' + college[0].state + ' ' + college[0].zip + '</li>'+
    '<li>' + college[0].phone + '</li>'+
    '</ul>'+
    '</body>'+
    '</html>';
    
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();
    }
    
    function unca(response) {
    console.log("Request handler 'abtech' was called.");
    
    var body = '<html>'+
    '<head>'+
    '<meta http-equiv="Content-Type" '+
    'content="text/html; charset=UTF-8" />'+
    '</head>'+
    '<body>'+
    '<ul>'+
    '<li></li>'+
    '<li></li>'+
    '<li></li>'+
    '<li></li>'+
    '</ul>'+
    '</body>'+
    '</html>';
    
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();
    }
    
    function home(response) {
    console.log("Request handler 'home' was called.");
    
    var body = '<html>'+
    '<head>'+
    '<meta http-equiv="Content-Type" '+
    'content="text/html; charset=UTF-8" />'+
    '</head>'+
    '<body>'+
    '<h1>Welcome to College</h2>'+
    '<p>Where would you like to visit?</p>'+
    '<ul>'+
    '<li><a href="/colleges">Colleges</a></li>'+
    '<li><a href="/hours">Hours of Operation</a></li>'+ 
    '<li><a href="/start">Upload a Photo</a></li>'+
    '<li><a href="/show">View Gallery</a></li>'+
    '</ul>'+
    '</body>'+
    '</html>';
    
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();
    }
    
    function colleges(response) {
    console.log("Request handler 'colleges' was called.");
    
    var body = '<html>'+
    '<head>'+
    '<meta http-equiv="Content-Type" '+
    'content="text/html; charset=UTF-8" />'+
    '</head>'+
    '<body>'+
    '<h1>Colleges</h2>'+
    '<ul>'+
    '<li><a href="/abtech">A-B Tech</a></li>'+
    '<li><a href="/unca">UNC Asheville</a></li>'+
    '<li><a href="/uncc">UNC Charlotte</a></li>'+
    '<li><a href="/wcu">Western Carolina</a></li>'+
    '<li><a href="/ncsu">NC State</a></li>'+
    '</ul>'+
    '</body>'+
    '</html>';
    
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();
    }
    
    function hours(response) {
    console.log("Request handler 'gallery' was called.");
    
    var body = '<html>'+
    '<head>'+
    '<meta http-equiv="Content-Type" '+
    'content="text/html; charset=UTF-8" />'+
    '</head>'+
    '<body>'+
    '<h1>Hours of Operation</h2>'+
    '<table>'+
    '<tr><td>Monday - Thursday</td><td>9 a.m. - 7 p.m.</td></tr>'+
    '<tr><td>Friday</td><td>9 a.m. - 5 p.m.</td></tr>'+
    '<tr><td>Saturday</td><td>9 a.m. - 12 p.m.</td></tr>'+
    '</table>'+
    '</body>'+
    '</html>';
    
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();
    }
    
    
    function start(response) {
    console.log("Request handler 'start' was called.");
    
    var body = '<html>'+
    '<head>'+
    '<meta http-equiv="Content-Type" '+
    'content="text/html; charset=UTF-8" />'+
    '</head>'+
    '<body>'+
    '<h1>Upload a file</h2>'+
    '<p>It will be shown on the /show url after</p>'+
    '<form action="/upload" enctype="multipart/form-data" '+
    'method="post">'+
    '<input type="file" name="upload" multiple="multiple">'+
    '<input type="submit" value="Upload file" />'+
    '</form>'+
    '</body>'+
    '</html>';
    
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();
    }
    
    function upload(response, request) {
    console.log("Request handler 'upload' was called.");
    
    var form = new formidable.IncomingForm();
    console.log("about to parse");
    form.parse(request, function(error, fields, files) {
    console.log("parsing done");
    
    /* Possible error on Windows systems:
       tried to rename to an already existing file */
    fs.rename(files.upload.path, "/home/ubuntu/node_stuff/node_assignment/test.jpg", function(err) {
      if (err) {
        fs.unlink("/home/ubuntu/node_stuff/node_assignment/test.jpg")
        fs.rename(files.upload.path, "/home/ubuntu/node_stuff/node_assignment/test.jpg");
      }
    });
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("received image:<br/>");
    response.write("<img src='/show' />");
    response.end();
    });
    }
    
    function show(response) {
    console.log("Request handler 'show' was called.");
    fs.readFile("/home/ubuntu/node_stuff/node_assignment/test.jpg", "binary", function(error, file) {
    if(error) {
      response.writeHead(500, {"Content-Type": "text/plain"});
      response.write(error + "\n");
      response.end();
    } else {
      response.writeHead(200, {"Content-Type": "image/jpg"});
      response.write(file, "binary");
      response.end();
    }
    });
    }
    
    exports.start = start;
    exports.upload = upload;
    exports.show = show;
    exports.home = home;
    exports.colleges = colleges;
    exports.hours = hours;
    exports.abtech = abtech;
    

    Any hints about what I am doing wrong would be very much appreciated. My instructor is tough to get a hold of during the weekend, so I don't really have anywhere else to turn. Thank you.