我在我的Express API上有一个简单的put请求,在我使用Sequelize ORM进行更新之后,我不能使用Socket.io发出。
我只能发出其他对象,例如,我可以发出这个{"hello":"world"},但是我不能发出更新的结果。
下面是这段代码:
module.exports = {
async update(req, res) {
const { body } = req;
const { task_id } = req.params;
const task = await ProjectTask.findByPk(task_id);
task.update({
name: body.title,
description: body.description,
});
req.io.emit('update', task); // Here it is the socket.io that brakes the code
console.log(task); // this works
return res.json(task); // also this
},
}Error:(node:8923) UnhandledPromiseRejectionWarning: RangeError:_removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:99:24) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:126:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:99:24) at _removeBlobs (/Users/guifeliper )的最大调用堆栈大小超出了/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs _removeBlobs在(/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:的(/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130: at _removeBlobs _removeBlobs at _removeBlobs _removeBlobs9)在(/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.的(/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.的_removeBlobs _removeBlobs at _removeBlobs _removeBlobsjs:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) at _removeBlobs (/Users/guifeliper/nodejs/node_modules/socket.io-parser/binary.js:130:9) (节点:8923) UnhandledPromiseRejectionWarning: Unhandled rejection。此错误是由于在没有catch块的异步函数内部引发,或拒绝未使用.catch()处理的promise造成的。(拒绝id: 1) (节点:8923) DEP0018 DeprecationWarning:未处理的promise拒绝已弃用。将来,未处理的promise拒绝将使用非零退出代码终止Node.js进程。
编辑:会不会是因为项目格式?这是我们在任务变量上所拥有的:
{
"id": 10971,
"name": "Change the background image 5",
"description": "save description 2",
"dueEndDate": null,
"status": 3,
"deleted": {
"type": "Buffer",
"data": [
0
]
},
"closed": {
"type": "Buffer",
"data": [
0
]
},
"createdAt": "2019-12-18T16:06:57.000Z",
"modifiedAt": "2019-12-21T14:43:39.000Z",
"sprint_id": 41
}未解析:
ProjectTask {
dataValues:
{ id: 10971,
name: 'Change the background image 5',
description: 'save description 2',
dueEndDate: null,
status: 3,
deleted: <Buffer 00>,
closed: <Buffer 00>,
createdAt: 2019-12-18T16:06:57.000Z,
modifiedAt: 2019-12-21T14:43:39.000Z,
sprint_id: 41 },
_previousDataValues:
{ id: 10971,
name: 'Change the background image 5',
description: 'save description 2',
dueEndDate: null,
status: 3,
deleted: <Buffer 00>,
closed: <Buffer 00>,
createdAt: 2019-12-18T16:06:57.000Z,
modifiedAt: 2019-12-21T14:43:39.000Z,
sprint_id: 41 },
_changed: {},
_modelOptions:
{ timestamps: true,
validate: {},
freezeTableName: true,
underscored: false,
paranoid: false,
rejectOnEmpty: false,
whereCollection: { id: '10971' },
schema: null,
schemaDelimiter: '',
defaultScope: {},
scopes: {},
indexes: [],
name: { plural: 'ProjectTasks', singular: 'ProjectTask' },
omitNull: false,
createdAt: 'createdAt',
updatedAt: 'modifiedAt',
sequelize:
Sequelize {
options: [Object],
config: [Object],
dialect: [MysqlDialect],
queryInterface: [QueryInterface],
models: [Object],
modelManager: [ModelManager],
connectionManager: [ConnectionManager],
importCache: {} },
hooks: {} },
_options:
{ isNewRecord: false,
_schema: null,
_schemaDelimiter: '',
raw: true,
attributes:
[ 'id',
'name',
'description',
'dueEndDate',
'status',
'deleted',
'closed',
'createdAt',
'modifiedAt',
'sprint_id' ] },
isNewRecord: false }发布于 2019-12-21 23:13:46
我从未使用过sequelize,但task中肯定有一些循环引用。
因此,您可以在sequelize查询中使用raw: true选项,或者只使用.toJSON、解构或类似方法发送您想要的属性。
你提到你有一个对象的“解析”版本,发送它而不是sequelize对象。
除了使用raw之外,还应该使用以下方法:
req.io.emit('update', task.toJSON()); // will only have table attributesreq.io.emit('update', JSON.stringify(task)); // you'll get it as string in FEhttps://stackoverflow.com/questions/59437267
复制相似问题