expressjs / express-expose

Expose raw js, objects, and functions to the client-side (awesome for sharing utils, settings, current user data etc)
MIT License
299 stars 26 forks source link

function string #29

Open pgherveou opened 12 years ago

pgherveou commented 12 years ago

Hi TJ express-expose define the following function to create a string representation of objects

function string(obj) {
  if ('function' == typeof obj) {
    return obj.toString();
  } else if (obj instanceof Date) {
    return 'new Date("' + obj + '")';
  } else if (Array.isArray(obj)) {
    return '[' + obj.map(string).join(', ') + ']';
  } else if ('[object Object]' == Object.prototype.toString.call(obj)) {
    return '{' + Object.keys(obj).map(function(key){
      return '"' + key + '":' + string(obj[key]);
    }).join(', ') + '}';
  } else {
    return JSON.stringify(obj);
  }
}

This works well except when used with mongo ObjectId object, where I end up with this serialisation

window.someId = window.someId || {};
someId["_bsontype"] = "ObjectID";
someId["id"] = "OϏ\u001a¾Å°U\u0000\u00000";

for my use case, I could replace the Object.prototype.toString statement with obj.toString (toString return string representation on ObjectId)

...
 // else if ('[object Object]' == Object.prototype.toString.call(obj)) {
 else if ('[object Object]' == obj.toString.call(obj)) {

Could the function be exposed somehow so I can inject my customisations ? Or do you see a better solution for this kind of issues ?

tj commented 12 years ago

we should probably add regular toJSON support, that could be used

pgherveou commented 12 years ago

That sounds like a good idea in my case i ended up to write something like that

res.expose("me = " + (JSON.stringify(user.toJSON())) + ";");