首页 > 解决方案 > 使用 Sequelize 破坏模型的麻烦

问题描述

怎么了?

我试图通过params. 但是当我尝试销毁时,控制台上会出现此错误。

(node:13350) UnhandledPromiseRejectionWarning: TypeError: results.map is not a function
    at Query.handleSelectQuery (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/sequelize/lib/dialects/abstract/query.js:261:24)
    at Query.formatResults (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/sequelize/lib/dialects/mysql/query.js:118:19)
    at /home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/sequelize/lib/dialects/mysql/query.js:71:29
    at tryCatcher (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/promise.js:547:31)
    at Promise._settlePromise (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/promise.js:604:18)
    at Promise._settlePromise0 (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/promise.js:649:10)
    at Promise._settlePromises (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/promise.js:729:18)
    at _drainQueueStep (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/async.js:93:12)
    at _drainQueue (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/async.js:86:9)
    at Async._drainQueues (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/async.js:102:5)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/vagnerwentz/Documents/freelance/autoparanaiba-api/node_modules/bluebird/js/release/async.js:15:14)
    at processImmediate (internal/timers.js:439:21)
    at process.topLevelDomainCallback (domain.js:130:23)
(node:13350) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:13350) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

调用函数的路由

router.delete('/agricultural/announce/:id', passport.authenticate(), (req, res) => {
    AnnouncementAgricultural.destroy(req, res);
})

功能

exports.destroy = async (req, res) => {
    if (!await authorize(req, res, true)) {
        return res.status(400).json({ success: false, errors: "unauthorized" })
    }

    await sequelize.query('SET FOREIGN_KEY_CHECKS=0;', { type: sequelize.QueryTypes.SELECT });

    await Annoucement.destroy({
        where: { id: req.params.id }
    }
    ).then((result) => {
        console.log(result);
        res.status(200).json({ success: true })
    }).catch((err) => {
        console.log(err)
        res.status(400).json({ success: false, errors: err.errors })
    });
}

标签: javascriptnode.jssequelize.js

解决方案


您发送的QueryType告诉 Sequelize 如何格式化结果。如果您正在执行SET并发送QueryType.SELECT,您将收到一个错误,因为它试图.map()在一个对象上使用:

const results = await sequelize.query("SET NAMES utf8mb4;", {
    type: sequelize.QueryTypes.SELECT }
);
// -> TypeError: results.map is not a function

可悲的是,在许多地方,文档混淆了原始查询(以纯文本形式发送 SQL)和使用QueryTypes.RAW(仅应用于格式化非 SELECT、UPDATE 等查询的结果)。因此,可以假设,如果您要进行原始查询,您应该使用相同的QueryType来使查询“原始”。至少,我们应该能够假设它只影响数据的返回方式。续集文档

如果您正在运行不需要元数据的查询类型,例如 SELECT 查询,则可以传入查询类型以对结果进行 sequelize 格式

令人困惑的是,如果您使用的是 SELECT,那么这些示例都不会导致问题:

sequelize.query("SELECT * FROM table");
sequelize.query("SELECT * FROM table", { type: sequelize.QueryTypes.SELECT });
sequelize.query("SELECT * FROM table", { type: sequelize.QueryTypes.UPDATE });
sequelize.query("SELECT * FROM table", { type: sequelize.QueryTypes.RAW });

但是,如果您在 UPDATE Sequelize 上使用 RAW 会尝试映射对象

sequelize.query("UPDATE table SET createdAt = NOW();", {
    type: sequelize.QueryTypes.RAW }
);
There was an uncaught error TypeError: results.map is not a function
    at Query.handleSelectQuery ([...]/node_modules/sequelize/lib/dialects/abstract/query.js:261:24)
    at Query.formatResults ([...]/node_modules/sequelize/lib/dialects/mysql/query.js:123:19)
    at Query.run ([...]/node_modules/sequelize/lib/dialects/mysql/query.js:76:17)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async [...]/node_modules/sequelize/lib/sequelize.js:619:16

SET因此,正如@Anatoly 所说,因为您正在使用您可以从更改QueryTypes.SELECTQueryTypes.RAW以避免错误。但是,如果您不需要结果,则根本不要传递 QueryType。

await sequelize.query('SET FOREIGN_KEY_CHECKS=0;');
// -> keep on keepin' on

推荐阅读