UnhandledPromiseRejectionWarning:AssertionError [ERR_ASSERTION]:表达式计算为虚假值:

时间:2018-10-24 23:15:17

标签: javascript node.js

使用节点版本10和MongoDB数据库运行Mocha测试时,我遇到了一个巨大的错误:

  

(节点:27884)UnhandledPromiseRejectionWarning:AssertionError   [ERR_ASSERTION]:表达式计算为虚假值:

     

assert(       user.blogPosts [0] .comments [0] .content ===         “随着程序变得越来越大,它们也会变得越来越复杂”)

at User.findOne.populate.then.user (/Users/danale/Projects/users/test/association_test.js:50:9)
at process._tickCallback (internal/process/next_tick.js:68:7) (node:27884) UnhandledPromiseRejectionWarning: Unhandled promise
     

拒绝。该错误是由抛出异步内部引起的   没有捕获块或拒绝承诺   未使用.catch()处理。 (拒绝ID:1)(节点:27884)[DEP0018]   DeprecationWarning:已弃用未处理的承诺拒绝。在   未来,未处理的承诺拒绝将终止   具有非零退出代码的Node.js进程。

对于较早运行的Mocha测试:

it('saves a full relation graph', done => {
    User.findOne({ name: 'Joe' })
      .populate({
        path: 'blogPosts',
        populate: {
          path: 'comments',
          model: 'comment',
          populate: {
            path: 'user',
            model: 'user'
          }
        }
      })
      .then(user => {
        assert(user.name === 'Joe');
        assert(user.blogPosts[0].title === 'Eloquent JavaScript');
        assert(
          user.blogPosts[0].comments[0].content ===
            'As programs get bigger, they also become more complex'
        );
        assert(user.blogPosts[0].comments[0].user.name === 'Joe');
        done();
      });
  });

所以我知道问题出在这里:

assert(
   user.blogPosts[0].comments[0].content ===
     'As programs get bigger, they also become more complex'
);

但是这到底是什么问题?

2 个答案:

答案 0 :(得分:0)

您需要一个catch块来查找。 populate()返回一个promise,但是当promise失败时,它们必须被捕获并处理。

有关更多信息,请参见the docs,但可以将其视为您可能已经熟悉的try { } catch { }块。

您的代码在此处附加了catch和发生的错误的日志。

it('saves a full relation graph', done => {
User.findOne({ name: 'Joe' })
  .populate({
    path: 'blogPosts',
    populate: {
      path: 'comments',
      model: 'comment',
      populate: {
        path: 'user',
        model: 'user'
      }
    }
  })
  .then(user => {
    assert(user.name === 'Joe');
    assert(user.blogPosts[0].title === 'Eloquent JavaScript');
    assert(
      user.blogPosts[0].comments[0].content ===
        'As programs get bigger, they also become more complex'
    );
    assert(user.blogPosts[0].comments[0].user.name === 'Joe');
    done();
  })
  .catch((err) => {
    console.error("Handling promise rejection", err);
  });
});

答案 1 :(得分:0)

该错误消息适用于我正在测试的content,因为我在content块中测试了错误的it()。我正在content内测试beforeEach()

beforeEach(done => {
    joe = new User({ name: 'Joe' });
    blogPost = new BlogPost({
      title: 'Eloquent JavaScript',
      content: 'As programs get bigger, they also become more complex'
    });

当我真的在这里尝试测试content对象中的comment时: comment = new Comment({ content: 'Love this post' });

一旦我将其更正为上面合适的content,所有测试都将通过。