TypeError oplossen: kan undefined of null niet naar object converteren

Ik heb een aantal functies geschreven die JSON.stringify() effectief repliceren, waarbij een reeks waarden wordt omgezet in stringified versies. Wanneer ik mijn code overzet naar JSBin en het op een aantal voorbeeldwaarden uitvoer, werkt het prima. Maar ik krijg deze foutmelding in een spec runner die is ontworpen om dit te testen.

Mijn code:

 // five lines of comments
  var stringify = function(obj) {
  if (typeof obj === 'function') { return undefined;}  // return undefined for function
  if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
  if (typeof obj === 'number') { return obj;} // number unchanged
  if (obj === 'null') { return null;} // null unchanged
  if (typeof obj === 'boolean') { return obj;} // boolean unchanged
  if (typeof obj === 'string') { return '\"' + obj + '\"';} // string gets escaped end-quotes
  if (Array.isArray(obj)) { 
    return obj.map(function (e) {  // uses map() to create new array with stringified elements
        return stringify(e);
    });
  } else {
    var keys = Object.keys(obj);   // convert object's keys into an array
    var container = keys.map(function (k) {  // uses map() to create an array of key:(stringified)value pairs
        return k + ': ' + stringify(obj[k]);
    });
    return '{' + container.join(', ') + '}'; // returns assembled object with curly brackets
  }
};
var stringifyJSON = function(obj) {
    if (typeof stringify(obj) != 'undefined') {
        return "" + stringify(obj) + "";
    }
};

De foutmelding die ik krijg van de tester is:

TypeError: Cannot convert undefined or null to object
    at Function.keys (native)
    at stringify (stringifyJSON.js:18:22)
    at stringifyJSON (stringifyJSON.js:27:13)
    at stringifyJSONSpec.js:7:20
    at Array.forEach (native)
    at Context.<anonymous> (stringifyJSONSpec.js:5:26)
    at Test.Runnable.run (mocha.js:4039:32)
    at Runner.runTest (mocha.js:4404:10)
    at mocha.js:4450:12
    at next (mocha.js:4330:14)

Het lijkt te mislukken met:
stringifyJSON(null) bijvoorbeeld


Antwoord 1, autoriteit 100%

Algemeen antwoord

Deze fout wordt veroorzaakt wanneer u een functie aanroept die een Objectals argument verwacht, maar in plaats daarvan undefinedof nulldoorgeeft, zoals voor voorbeeld

Object.keys(null)
Object.assign(window.UndefinedVariable, {})

Omdat dat meestal per ongeluk is, is de oplossing om uw code te controleren en de voorwaarde null/undefinedop te lossen, zodat de functie ofwel een juist Objectkrijgt, of helemaal niet gebeld worden.

Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
    Object.assign(window.UndefinedVariable, {})
}

Antwoord specifiek voor de code in kwestie

De regel if (obj === 'null') { return null;} // null unchangedzal niet
evalueren wanneer nullwordt gegeven, alleen als de tekenreeks "null"wordt gegeven. Dus als u de werkelijke waarde nulldoorgeeft aan uw script, wordt deze geparseerd in het Object-gedeelte van de code. En Object.keys(null)genereert de genoemde TypeError. Om het op te lossen, gebruik je if(obj === null) {return null}– zonder de qoutes rond null.


Antwoord 2, autoriteit 3%

Zorg ervoor dat het doelobject niet leeg is ( nullof undefined).

U kunt het doelobject initialiseren met een leeg object zoals hieronder:

var destinationObj = {};
Object.assign(destinationObj, sourceObj);

Antwoord 3

Dit is erg handig om fouten te voorkomen bij het openen van eigenschappen van null- of ongedefinieerde objecten.

null tot ongedefinieerd object

const obj = null;
const newObj = obj || undefined;
// newObj = undefined

undefined om object leeg te maken

const obj; 
const newObj = obj || {};
// newObj = {}     
// newObj.prop = undefined, but no error here

null om object leeg te maken

const obj = null;
const newObj = obj || {};
// newObj = {}  
// newObj.prop = undefined, but no error here

Antwoord 4

Ik heb hetzelfde probleem opgelost in een React Native-project. Ik heb het hiermee opgelost.

let data = snapshot.val();
if(data){
  let items = Object.values(data);
}
else{
  //return null
}

Antwoord 5

In mijn geval heb ik de Lucid-extensie toegevoegd aan Chrome en merkte het probleem op dat moment niet op. Na ongeveer een dag aan het probleem te hebben gewerkt en het programma op zijn kop te hebben gezet, had iemand in een post Lucid genoemd. Ik herinnerde me wat ik had gedaan en verwijderde de extensie uit Chrome en voerde het programma opnieuw uit. Het probleem was weg. Ik werk met React. Ik dacht dat dit misschien zou helpen.


Antwoord 6

Vervangen

if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
if (obj === 'null') { return null;} // null unchanged

met

if (obj === undefined) { return undefined;} // return undefined for undefined 
if (obj === null) { return null;} // null unchanged

Antwoord 7

Als je Laravelgebruikt, zat mijn probleem in de naam van mijn route.
In plaats daarvan:

Route::put('/reason/update', 'REASONController@update');

Ik schreef:

Route::put('/reason/update', 'RESONController@update');

en toen ik de naam van de controller herstelde, werkte de code!


Antwoord 8

In mijn geval had ik een extra paar haakjes ()

In plaats van

export default connect(
  someVariable
)(otherVariable)()

Het moest zijn

export default connect(
  someVariable
)(otherVariable)

Antwoord 9

Het onderstaande fragment is voldoende om te begrijpen hoe ik hetzelfde probleem ben tegengekomen, maar in een ander scenario en hoe ik het heb opgelost met behulp van de richtlijnen in het geaccepteerde antwoord. In mijn geval probeerde ik de sleutels van het object in de 0e index van de ‘defaultViewData’-array te loggen met behulp van de Object.keys()-methode.

defaultViewData = [{"name": "DEFAULT_VIEW_PLP","value": {"MSH25": "LIST"}}] 
console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));

De console.log werd niet afgedrukt en ik kreeg dezelfde foutmelding als in deze vraag. Om die fout te voorkomen heb ik onderstaande voorwaarde toegevoegd

   if(this.props.defaultViewData[0]) {
  console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
}

Het toevoegen van deze controle zorgde ervoor dat ik deze fout niet kreeg. Ik hoop dat dit iemand helpt.

Opmerking: dit is React.js-code. (hoewel het niet uitmaakt om het probleem te begrijpen).


Antwoord 10

Ik heb hetzelfde probleem met een element in een webformulier. Dus wat ik deed om het te repareren, was valideren.
if(Object === ‘null’)
iets doen

LEAVE A REPLY

Please enter your comment!
Please enter your name here

ten − 7 =

Other episodes