为啥这个简单的 Node, Sequelize Promise 代码会挂起?
Posted
技术标签:
【中文标题】为啥这个简单的 Node, Sequelize Promise 代码会挂起?【英文标题】:Why does this simple Node, Sequelize Promise code hang?为什么这个简单的 Node, Sequelize Promise 代码会挂起? 【发布时间】:2018-01-31 22:03:34 【问题描述】:我正在尝试使用 node.js 和 sequelize 进行简单的命令行数据库转换。我已将错误代码简化为以下内容,但它永远不会返回:
// Set up database connection and models
var models = require('../models_sequelize');
models.User.findOne()
.then(a =>
console.log(a.name);
);
我打印了一个名称,但随后脚本挂起。怎么了?我该如何调试它以查看卡住了什么?我的印象是有一个孤儿承诺没有兑现,但我不明白在哪里或为什么。我一定遗漏了一些明显的东西。
如果我从节点控制台以交互方式运行相同的程序,它会返回正常。
【问题讨论】:
完成后不应该有类似close()
的方法来终止数据库连接吗?
即使他关闭,也不会改变任何事情。你能在这里分享更多的代码块细节吗?还尝试将所有内容放在 try catch 块中以识别问题
我已将代码简化到非常少,包括删除没有添加到问题的问题。大概无论如何都会在控制台上吐出任何异常? Close 似乎修复了它,所以大概这就是它被阻止的原因。
【参考方案1】:
Sirko 的评论 re: close() 给了我一些继续。我可以使用以下代码停止挂起:
var models = require('../models_sequelize');
models.User.findOne()
.then(a =>
console.log(a.name);
models.sequelize.close();
)
另外,这似乎也有效,因为我猜它正在做完全相同的事情: var models = require('../models_sequelize');
models.User.findOne()
.then(a =>
console.log(a.name);
)
.finally(() =>
models.sequelize.close();
);
我还发现了一些关于连接池超时的信息,但我认为这不会影响我的简单用例。我想它会在更复杂的例子中发挥作用。
仍然希望找到一个很好的参考来说明为什么这是必要的,而不仅仅是我的猜测。
【讨论】:
另一种选择是您可以致电process.exit()
。这也会隐式关闭数据库连接。
虽然这是正确的答案,但它仍然表明 sequelize 的质量很差,它会以这种形式等待。以上是关于为啥这个简单的 Node, Sequelize Promise 代码会挂起?的主要内容,如果未能解决你的问题,请参考以下文章
node+pm2+express+mysql+sequelize来搭建网站和写接口
Sequelize简单好上手的node.js ORM框架[MarkDown Note]