You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Promise的.then()中修改Sequelize返回的数组?

问题分析

你的代码主要有两个问题:

  1. 语法错误:箭头函数中包含多个语句时,必须用大括号{}包裹,否则JavaScript无法正确解析语句结构;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:06