【发布时间】: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 => user.dataValues映射users。
标签: javascript typescript express ecmascript-6