我希望在 sequelize findAll 方法之后创建一个新属性。

通过使用这种方法
setDataValue
我得到



https://sequelize.org/master/class/lib/model.js~Model.html#instance-method-setDataValue

javascript - setDataValue 不是调用 sequelize findAll 方法后的函数-LMLPHP

post.controller.js

 getPosts: async (req: any, res: Response) => {
    await models.Post.findAll({
      include: [
        { model: models.User, as: "author", attributes: ["username"] },
        { model: models.Likes }
      ],
      order: [["createdAt", "DESC"]],
      limit: 6
    }).then(posts => {
      posts.setDataValue('test', 'hoot')
      res.json(posts);
    });
  },

最佳答案

在您的示例中 posts 是一个数组,而不是单个对象,因此您不能对其调用 setDataValue()。如果您想要单个结果,请使用 findOne()findByPk()

循环遍历数组以访问返回访问 setDataValue() 的每个实例。或者在您的查询中使用 raw: true 返回原始 JSON 对象,您可以设置键,如果目的是作为 JSON 返回,这将提高性能。

由于您正在使用 async/await,您还应该避免使用 thenables。请尝试以下操作:

getPosts: async (req: any, res: Response) => {
  // use async/await here
  const posts = await models.Post.findAll({
    include: [
      { model: models.User, as: "author", attributes: ["username"] },
      { model: models.Likes }
    ],
    order: [["createdAt", "DESC"]],
    limit: 6,
    // uncomment this line to return raw JSON objects instead of Model Instances
    // raw: true,
  });

  // loop over each post in the array and convert t
  posts.forEach((post) => post.setDataValue('test', 'hoot'));

  // return result
  // note that you probably want to call post.toJSON()
  // or add raw: true to your query
  return res.json(posts);
},

关于javascript - setDataValue 不是调用 sequelize findAll 方法后的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58661007/

10-13 02:37