javascript - 使用 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 })
});
}
解决方案
您发送的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.SELECT
为QueryTypes.RAW
以避免错误。但是,如果您不需要结果,则根本不要传递 QueryType。
await sequelize.query('SET FOREIGN_KEY_CHECKS=0;');
// -> keep on keepin' on
推荐阅读
- javascript - 当 div 失焦并且将文本添加到 ngmodel 时出现 Contenteditable 问题
- javascript - 从.live更新一对jquery切换功能不起作用
- c - 函数没有通过某些测试用例
- python - python上的内核密度模拟
- qt - 如何设置 QT Creator 以使用 Autodesk FBX SDK 作为库?
- javascript - 在 Angular 中分离双向数据绑定
- python - Python - Selenium - 两个相等的网站输入框,一个使用 send_keys(),另一个不使用
- ruby-on-rails - Rails 通过循环正确传递 ID
- c - C socket Webserver不在浏览器中显示html,只发送HTTP响应
- c# - 在 JSON.net 中覆盖 StringEnumConverter