为什么 JSON.parse 会抛出跨域错误?

IT技术 javascript reactjs storybook
2021-05-08 17:10:02

没有 JSON.parse 下面的代码工作正常。如果我尝试解析或字符串化我的数据对象,我会收到一个跨域错误。为什么会发生这种情况,我该如何解决?

我在 Title.js 中有以下一段代码:

const { name, show_title } = JSON.parse(data.attributes);

这是我从 Title.stories.js 传递过来的数据对象:

{"attributes":{"name":"testNameAttribute","show_title":"0"}}

我在 Chrome 中收到以下错误:

错误:引发了跨域错误。React 无权访问开发中的实际错误对象。在 Object.invokeGuardedCallbackDev ( http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:74131:19 ) 在 invokeGuardedCallback ( http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:74131: 19:19 ) 31 ) 在 beginWork$1 ( http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:99439:7 ) at performUnitOfWork ( http://localhost:9002/vendors~main.dabd386ab27fa6edjs93.bundle. 98347:12 ) at workLoopSync ( http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:98323:22 ) at performSyncWorkOnRoot (http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:97891:11 ) at scheduleUpdateOnFiber ( http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:97299:7 ) at scheduleRoot http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:100654:3 ) at updateContainerAtExpirationTime ( http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:100682 ) at updateContainerAtExpirationTime ( http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:100682 ) http://localhost:9002/vendors~main.dabd386ab27fa6eddf93.bundle.js:100784:10 )

Firefox 中的这个错误:

JSON.parse:JSON 数据第 1 行第 2 列的意外字符

按钮@ HTTP://本地主机:9002 / main.96db0eff63ba8f27231c.hot-update.js:38:26 renderWithHooks @ HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:90029:18 mountIndeterminateComponent @ HTTP: //localhost:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:92444:13 beginWork $ -1 @ HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:93793:16 callCallback @ HTTP://本地主机:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:74071:14 invokeGuardedCallbackDev@ http://localhost:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle@Guardjs: 79Callbackv2@ localhost: 764100 ~main.f1b2a3fffbb517f9fb67.bundle.js:74175:31 beginWork$$1@ http://localhost:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:99439:7 performUnitOfWork@ http://localhost:9002/vendors~ main.f1b2a3fffbb517f9fb67.bundle.0oop@8Sync@8 HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:98323:22 performSyncWorkOnRoot @ HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:97891:11 scheduleUpdateOnFiber @ HTTP://本地主机:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:97299:7 scheduleRootUpdate@ http://localhost:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:100654 /localhostExpirationTime @ 100654 /localhostExpirationTime @ 100654:300 更新供应商~main.f1b2a3fffbb517f9fb67.bundle.js:100682:10 updateContainer@ http://localhost:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:100784:10 legacyRenderSubtreeIntoContainer/<@ http://localhost:9002/vendors~main.f1b2a3fffbb517f9fb67: @ 0bundle. HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:98084:12 legacyRenderSubtreeIntoContainer @ HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:101371:5 呈现@ HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:101465:12 呈现/ <@ HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:11741:26 渲染@ HTTP://本地主机: 9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:11740:10 _callee $ @的http://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:11837:20 tryCatch @ HTTP://本地主机:9002 /厂商〜main.f1b2a3fffbb517f9fb67.bundle.js:127832:40 调用@ HTTP ://localhost:9002/vendors~main.f1b2a3fffbb517f9fb67.bundle.js:128058: 22defineIteratorMethods/

1个回答

这是因为你attributes是一个对象而不是字符串

/** Attributes is a string */
const data = {
  "attributes": `{
    "name": "testNameAttribute",
    "show_title": "0"
  }`
};
const { name, show_title } = JSON.parse(data.attributes);
console.log(name) //Output "testNameAttribute"


/** Attributes is an object */
const data = {
  "attributes": {
    "name": "testNameAttribute",
    "show_title": "0"
  }
};
const { name, show_title } = JSON.parse(data.attributes);
console.log(name) //Error

在此处输入图片说明