So lösen Sie TypeError auf: Undefinierte oder null können nicht in Objekte konvertiert werden

91

Ich habe einige Funktionen geschrieben, die JSON.stringify () effektiv replizieren und einen Wertebereich in stringifizierte Versionen konvertieren. Wenn ich meinen Code auf JSBin portiere und ihn auf einigen Beispielwerten ausführe, funktioniert er einwandfrei. Aber ich erhalte diesen Fehler in einem Spezifikationsläufer, der entwickelt wurde, um dies zu testen.

Mein 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) + "";
    }
};

Die Fehlermeldung, die ich vom Tester erhalte, lautet:

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)

Es scheint zu scheitern mit: stringifyJSON (null) zum Beispiel

zahabba
quelle
1
Bitte geben Sie die Eingabe an, für die Sie eine Fehlermeldung erhalten, da diese für stringifyJSON ({a: 'b', c: 'd'})
funktioniert
1
Abgesehen von dem Fehler werden stringifyJSON([1,2,3])zurückgegeben 1,2,3und stringifyJSON({foo: 'bar'})zurückgegeben {foo: "bar"}, die beide kein gültiger JSON sind.
Felix Kling
4
Meine Vermutung wäre diese Zeile if (obj === 'null') { return null;} // null unchanged, - die nicht gegeben wird null, wenn gegeben , nur wenn die Zeichenfolge gegeben wird "null". Wenn Sie also den tatsächlichen nullWert an Ihr Skript übergeben, wird er im Objektteil des Codes analysiert. Und Object.keys(null)wirft das TypeErrorerwähnte. Verwenden Sie if(obj === null) {return null}zum Beheben des Problems - ohne die Qoutes null.
Veproza
1
Ein weiteres Problem: Ihr Code behandelt nicht die Möglichkeit, "Zeichen in Zeichenfolgen einzubetten .
Pointy
@Pointy - ja, ich muss etwas Logik dafür hinzufügen ... danke
zahabba

Antworten:

134

Generische Antwort

Dieser Fehler wird verursacht, wenn Sie eine Funktion aufrufen, die ein Objekt als Argument erwartet , aber stattdessen undefiniert oder null übergibt, wie zum Beispiel

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

Da dies normalerweise aus Versehen geschieht, besteht die Lösung darin, Ihren Code zu überprüfen und die null / undefinierte Bedingung zu korrigieren , sodass die Funktion entweder ein geeignetes Objekt erhält oder überhaupt nicht aufgerufen wird.

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

Antwort spezifisch für den fraglichen Code

Die Zeile if (obj === 'null') { return null;} // null unchanged wird nicht ausgewertet, wenn sie angegeben wird null, nur wenn die Zeichenfolge angegeben ist "null". Wenn Sie also den tatsächlichen nullWert an Ihr Skript übergeben, wird er im Objektteil des Codes analysiert. Und Object.keys(null)wirft das TypeErrorerwähnte. Um dies zu beheben, verwenden Sie if(obj === null) {return null}- ohne die qoutes um null.

Veproza
quelle
8
Highlight: "Und Object.keys(null)wirft das TypeErrorerwähnte."
Falsarella
1
Um ein weiteres häufiges Beispiel hinzuzufügen, wo dies geschieht: delete obj.propertywoobj===null
Gio
4

Stellen Sie sicher, dass das Zielobjekt nicht leer ist ( nulloder undefined).

Sie können das Zielobjekt wie folgt mit einem leeren Objekt initialisieren:

var destinationObj = {};

Object.assign(destinationObj, sourceObj);
Yuvraj Patil
quelle
2

Dies ist sehr nützlich, um Fehler beim Zugriff auf Eigenschaften von null oder undefinierten Objekten zu vermeiden.

null bis undefiniertes Objekt

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

undefiniert, um das Objekt zu leeren

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

null, um das Objekt zu leeren

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

Ich habe das gleiche Problem in einem React Native-Projekt gelöst. Ich habe es damit gelöst.

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

In meinem Fall habe ich die Lucid-Erweiterung zu Chrome hinzugefügt und das Problem in diesem Moment nicht bemerkt. Nach ungefähr einem Tag der Arbeit an dem Problem und dem Umdrehen des Programms hatte jemand in einem Beitrag Lucid erwähnt. Ich erinnerte mich an das, was ich getan hatte, entfernte die Erweiterung von Chrome und führte das Programm erneut aus. Das Problem war weg. Ich arbeite mit React. Ich dachte, das könnte helfen.

Behzad Akbari
quelle
0

Ersetzen

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

mit

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

Wenn Sie Laravel verwenden , lag mein Problem im Namen meiner Route. Stattdessen:

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

Ich schrieb:

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

und als ich den Namen des Controllers festlegte, funktionierte der Code!

Nicodemos dos Santos
quelle
0

In meinem Fall hatte ich ein zusätzliches Paar Klammern ()

Anstatt von

export default connect(
  someVariable
)(otherVariable)()

Es musste so sein

export default connect(
  someVariable
)(otherVariable)
Gerechtigkeit Bringer
quelle
0

Das folgende Snippet reicht aus, um zu verstehen, wie ich auf dasselbe Problem gestoßen bin, aber in einem anderen Szenario, und wie ich es mithilfe der Anleitung in der akzeptierten Antwort gelöst habe. In meinem Fall habe ich versucht, die Schlüssel des im 0. Index des Arrays 'defaultViewData' vorhandenen Objekts mithilfe der Object.keys () -Methode zu protokollieren.

defaultViewData = [{"name": "DEFAULT_VIEW_PLP","value": {"MSH25": "LIST"}}] 

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

Das console.log wurde nicht gedruckt und ich erhielt den gleichen Fehler wie in dieser Frage. Um diesen Fehler zu vermeiden, habe ich die folgende Bedingung hinzugefügt

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

Durch Hinzufügen dieser Prüfung wurde sichergestellt, dass dieser Fehler nicht angezeigt wurde. Ich hoffe das hilft jemandem.

Hinweis: Dies ist der Code von React.js. (obwohl es keine Rolle spielt, das Problem zu verstehen).

utkarsh-k
quelle
-2

Ich habe das gleiche Problem mit einem Element in einem Webformular. Also, was ich getan habe, um es zu beheben, war validieren. if (Object === 'null') macht etwas

Ivan Fernandez
quelle