如何在Promise的.then()中修改Sequelize返回的数组?
问题分析
你的代码主要有两个问题:
- 语法错误:箭头函数中包含多个语句时,必须用大括号
{}包裹,否则JavaScript无法正确解析语句结构; unshift的返回值问题:Array.unshift()返回的是修改后数组的长度,而不是数组本身,所以不能直接链式调用send方法。
正确的解决方案
方案1:修复语法并使用unshift修改原数组
如果你不介意修改Sequelize返回的原数组,可以用大括号包裹then中的多个语句,先执行unshift再发送响应:
const Category = require('../models').category; module.exports = { list(req, res) { return Category .all({attributes: ['title']}) .then(categories => { // 先在数组开头添加"all" categories.unshift({ title: "all" }); // 再发送修改后的数组 res.status(200).send(categories); }) .catch(error => res.status(400).send(error)); } };
方案2:创建新数组(推荐)
更稳妥的方式是创建一个新数组,避免修改Sequelize返回的原对象(有时Sequelize的结果是带有实例方法的特殊数组,修改原数组可能引发意外)。可以使用ES6的扩展运算符来实现:
const Category = require('../models').category; module.exports = { list(req, res) { return Category .all({attributes: ['title']}) .then(categories => { // 生成新数组,将"all"放在开头,拼接原数组内容 const modifiedCategories = [{ title: "all" }, ...categories]; res.status(200).send(modifiedCategories); }) .catch(error => res.status(400).send(error)); } };
为什么推荐方案2?
这种方式属于不可变操作,不会改变原数组的内容。如果后续代码中还有其他地方需要使用未修改的分类列表,原数组不会被影响,能避免潜在的bug。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

