为啥这个简单的 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来搭建网站和写接口

[转]Node.JS使用Sequelize操作MySQL

Sequelize简单好上手的node.js ORM框架[MarkDown Note]

node.js后端之sequelize

[转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

为啥 Sequelize 在 3120 条记录后会暂停?