首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Socket.io发出序列化结果时出错[Express,Socket.io,Sequelize]

使用Socket.io发出序列化结果时出错[Express,Socket.io,Sequelize]
EN

Stack Overflow用户
提问于 2019-12-21 23:07:19
回答 1查看 251关注 0票数 0

我在我的Express API上有一个简单的put请求,在我使用Sequelize ORM进行更新之后,我不能使用Socket.io发出。

我只能发出其他对象,例如,我可以发出这个{"hello":"world"},但是我不能发出更新的结果。

下面是这段代码:

代码语言:javascript
复制
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进程。

编辑:会不会是因为项目格式?这是我们在任务变量上所拥有的:

代码语言:javascript
复制
{
  "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
}

未解析:

代码语言:javascript
复制
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 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-21 23:13:46

我从未使用过sequelize,但task中肯定有一些循环引用。

因此,您可以在sequelize查询中使用raw: true选项,或者只使用.toJSON、解构或类似方法发送您想要的属性。

你提到你有一个对象的“解析”版本,发送它而不是sequelize对象。

除了使用raw之外,还应该使用以下方法:

代码语言:javascript
复制
req.io.emit('update', task.toJSON()); // will only have table attributes
代码语言:javascript
复制
req.io.emit('update', JSON.stringify(task)); // you'll get it as string in FE
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59437267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档