Sequelize Query FindAll 不过滤

Posted

技术标签:

【中文标题】Sequelize Query FindAll 不过滤【英文标题】:Sequelize Query FindAll doesn't filter 【发布时间】:2020-05-13 17:32:50 【问题描述】:

我创建了一个 rest api '/getSingleAxisByInstance',它接受一个 instanceid 并且应该从表 'Devices' 的 mysql 数据库中获取所有具有此 instanceid 的设备。

router.get('/getDeviceByInstance', (req, res) => 
    Device.findAll(where: instanceid: req.body.instanceid)
        .then(device=> 
            res.status(200).send(device);
        )
        .catch(err => res.status(400).json(message: 'Error', err));
);

但它不会过滤行,它只是从独立于 instanceid 的表中返回所有行。 当我像这样向查询中添加“属性”时,过滤确实有效:

Device.findAll(attributes: ['instanceid', 'name', 'deviceId'],
        where: instanceid: req.body.instanceid)

问题是我无法使用此代码从前端使用 REST Api。当我将属性添加到配置中时,查询每次都会失败。当我从配置中删除属性时,它工作正常。

带有axios请求的前端代码:

export const getDeviceByInstance = myInstance => 
    return axios
        .get('/device/getDeviceByInstance', 
            instanceId: myInstance.instanceId
        )
        .then((res => 
            return res;
        ))
        .catch(err => 
            return err;
        )
;

我的设备表型号代码:

const Sequelize = require('sequelize');
const db = require('../config/mainDatabase');


const Device= db.define('device', 
    deviceId: type: Sequelize.INTEGER, primaryKey: true,
    name: type: Sequelize.STRING,
    instanceId: type: Sequelize.INTEGER,
);
module.exports = Device;

我错过了什么?提前谢谢!

【问题讨论】:

req.body 打印是否正确?? 【参考方案1】:

问题是您在获取请求中传递了正文中的数据。

解决方案 1:将您的获取请求更改为发布

  return axios
        .post('/device/getDeviceByInstance',  // change it to post 
            instanceId: myInstance.instanceId
        )

也将您的路线设为发布

   router.post('/getDeviceByInstance', (req, res) =>   // change post route 

解决方案 2:您可以使用 get 请求作为查询/参数传递数据

     //frontend
     axios 
     .get(`/device/getDeviceByInstance/$myInstance.instanceId`)
     .then().catch();

     //backend 
     router.get('/getDeviceByInstance/:instanceId', (req, res) =>   // change you route 

             const instanceId = req.params.instanceId; // you can access it as 
       ..........

      

【讨论】:

如果您还有任何问题,请告诉我 我用 post 试过了,但它仍然没有过滤设备。 添加您更新的前端和后端代码。我会检查 你确定。您正在后端获取您的 instanceId 吗?做 console.log('instanceId',instanceId);让我知道你是否得到了你的 instanceId 是的,你是对的,当我在后端记录 instanceid 时它显示未定义,你知道这是为什么吗?我尝试了您的解决方案 2,效果很好,非常感谢!

以上是关于Sequelize Query FindAll 不过滤的主要内容,如果未能解决你的问题,请参考以下文章

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

使用 Sequelize 获取“TypeError:无法读取未定义的属性‘findAll’”

FindAll 包括更多关于 sequelize 查询的表

如何在 Sequelize 中按多对多关系排序?

Sequelize:在 findAll 中包含连接表属性包括

LIMIT在Sequelize findAll和findAndCountAll中返回错误的行数