Sequelize修改create查询为回调结构后无法返回响应的问题
Sequelize回调写法插入数据成功但无响应的解决方法
我将Sequelize的Promise风格代码改成回调结构后,数据能成功插入数据库,但接口无法返回响应。
原Promise代码:
Model = require('../models/Salesman') module.exports.creareSalesman = (req, res, next) => { Model.create(req.body).then( result => { res.status.json({data: result}) }).catch(err => console.log(err)) }
修改后的回调代码(存在问题):
Model = require('../models/Salesman') module.exports.creareSalesman = (req, res, next) => { Model.create(req.body, function (result, err) { if (err) { console.log(err) } else { res.status.json({data: result}) } }); }
问题原因
Sequelize的回调函数遵循Node.js错误优先的规范,参数顺序是err在前,result在后。你把参数顺序写反了,导致:
- 插入成功时,回调里的
result实际是undefined,err才是插入后的结果对象,代码进入if (err)分支只打印结果,没有返回响应; - 插入失败时,
result是错误对象,err是undefined,代码进入else分支尝试返回undefined的result,同样无法正常响应。
修复代码
修正回调参数顺序,同时完善错误处理(给前端返回错误响应,避免请求挂起):
Model = require('../models/Salesman') module.exports.creareSalesman = (req, res, next) => { Model.create(req.body, function (err, result) { if (err) { console.log(err); // 返回错误响应给前端 return res.status(500).json({error: err.message}); } // 成功时返回数据 res.status(200).json({data: result}); }); }
补充说明
- 错误优先回调是Node.js生态的通用规则,大部分Node.js库的回调都遵循此规范;
- 错误分支必须返回响应,否则客户端请求会一直处于pending状态,直到超时。
内容的提问来源于stack exchange,提问作者user20181423
相关产品推荐
相关产品推荐

