【问题标题】: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 似乎修复了它,所以大概这就是它被阻止的原因。

标签: node.js promise sequelize.js


【解决方案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 的质量很差,它会以这种形式等待。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2015-02-19
  • 2012-07-13
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多