【问题标题】:Convert a string representation of an array to a JS array将数组的字符串表示形式转换为 JS 数组
【发布时间】:2023-03-03 20:13:01
【问题描述】:

我正在转换一个遗留数据库,它目前将用户角色存储为一个字符串,如下所示:

["ADMIN", "MANAGER", "USER"]

我需要能够在我从 express 发送的响应中将其转换为数组。

我目前有:

userRouter.get('/getAllUsers', (req, res) => {
    const errors = validationResult(req)
    if (!errors.isEmpty())
        return res.status(422).json(errors.array())
    userService.getUsers()
        .then(users => res.status(200).json({
            exception: false,
            payload: users.map(user => ({
                ...user,
                params: JSON.parse(user.params)
            }))
        }));
})

但这给了我一个错误:

Unhandled rejection TypeError: Converting circular structure to JSON
    at JSON.stringify (<anonymous>)
    at stringify (/mnt/c/Development/tendesign/lfc-v2/node_modules/express/lib/response.js:1119:12)
    at ServerResponse.json (/mnt/c/Development/tendesign/lfc-v2/node_modules/express/lib/response.js:260:14)
    at /mnt/c/Development/tendesign/lfc-v2/dist/routers/user.router.js:21:57
    at tryCatcher (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/promise.js:693:18)
    at Async._drainQueue (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/mnt/c/Development/tendesign/lfc-v2/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:763:18)
    at tryOnImmediate (timers.js:734:5)
    at processImmediate (timers.js:716:5)

当我在处理之前 console.log(users) 时,我得到了这个:

[ user {
    dataValues:
     { id: 706,
       name: 'Sandra Will',
       email: 'sandra@design.us',
       params: '["ADMIN", "MANAGER", "USER"]',
       active: '1' },
    _previousDataValues:
     { id: 706,
       name: 'Sandra Will',
       email: 'sandra@design.us',
       params: '["ADMIN", "MANAGER", "USER"]',
       active: '1' },
    _changed: {},
    _modelOptions:
     { timestamps: false,
       validate: {},
       freezeTableName: false,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},
       scopes: [],
       indexes: [],
       name: [Object],
       omitNull: false,
       sequelize: [Sequelize],
       hooks: {},
       uniqueKeys: {} },
    _options:
     { isNewRecord: false,
       _schema: null,
       _schemaDelimiter: '',
       raw: true,
       attributes: [Array] },
    __eagerlyLoadedAssociations: [],
    isNewRecord: false },
  user {
    dataValues:
     { id: 710,
       name: 'Tommy Craw',
       email: 'thomas.craw@cargo.com',
       params: '["ADMIN", "MANAGER", "USER"]',
       active: '1' },
    _previousDataValues:
     { id: 710,
       name: 'Tommy Craw',
       email: 'thomas.craw@cargo.com',
       params: '["ADMIN", "MANAGER", "USER"]',
       active: '1' },
    _changed: {},
    _modelOptions:
     { timestamps: false,
       validate: {},
       freezeTableName: false,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},
       scopes: [],
       indexes: [],
       name: [Object],
       omitNull: false,
       sequelize: [Sequelize],
       hooks: {},
       uniqueKeys: {} },
    _options:
     { isNewRecord: false,
       _schema: null,
       _schemaDelimiter: '',
       raw: true,
       attributes: [Array] },
    __eagerlyLoadedAssociations: [],
    isNewRecord: false },
  user {
    dataValues:
     { id: 711,
       name: 'LeeAnne',
       email: 'leeanne.craw@cargo.com',
       params: '["ADMIN", "MANAGER", "USER"]',
       active: '1' },
    _previousDataValues:
     { id: 711,
       name: 'LeeAnne',
       email: 'leeanne.craw@cargo.com',
       params: '["ADMIN", "MANAGER", "USER"]',
       active: '1' },
    _changed: {},
    _modelOptions:
     { timestamps: false,
       validate: {},
       freezeTableName: false,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},

【问题讨论】:

  • 什么是user.params
  • @connexo user.params 将是从数据库返回的字符串
  • 所以user.params 仍然是一个JSON 字符串,而users 已经是一个可以使用map() 的数组??只需在处理之前显示users 是什么。
  • @connexo 我在上面的 OP 中添加了这个
  • 看起来问题不在于您的JSON.parse(user.params),而在于res.status(200).json() 电话。我会先尝试使用user =&gt; user.dataValues 映射users

标签: javascript typescript express ecmascript-6


【解决方案1】:

只需解析它。

const dbStr = '["ADMIN", "MANAGER", "USER"]';

const array = JSON.parse(dbStr);

console.log(array)

将循环结构转换为 JSON 意味着解析器陷入循环,因为属性指向父对象。

【讨论】:

  • user.params 不包含您在上面向我们展示的简单数组,向我们展示用户的整个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
相关资源
最近更新 更多