(node:5540)警告:在处理程序中创建了一个promise,但未从中返回

时间:2016-05-27 15:27:10

标签: javascript node.js

以下代码:

function handleError(res, statusCode) {
  statusCode = statusCode || 500;
  return function(err) {
    res.status(statusCode).send(err);
  };
}

function respondWithResult(res, statusCode) {
  statusCode = statusCode || 200;
  return function(entity) {
    if (entity) {
      res.status(statusCode).json(entity);
    }
  };
}


// Creates a new Store in the DB
export function create(req, res) {
  // create user
  let user = req.body.user;
  let store = req.body.store;

  auth.hash(user.password)
    .then(hash => {
      user.password = hash;
      // Create user, then create store, attach store object id to user, and attach user object id to store
      User.create(user)
      .then(userRes => {
        store.owner    = userRes._id;
        store.memebers = [];
        store.memebers.push(store.owner);

        Store.create(store)
        .then(storeRes => {
          return respondWithResult(res, 201);
        })
        .catch(err => handleError(err));
      })
      .catch(err => handleError(err));
    })
    .catch(err => handleError(err));
}

打印标题中提到的错误“(节点:5540)警告:在处理程序中创建了一个承诺但未从中返回”#。我试过更改和调整代码,但错误仍然存​​在。

2 个答案:

答案 0 :(得分:1)

此警告是因为您的代码在.then()处理程序内创建了promise,但未从这些处理程序返回。

变化:

User.create(user)

为:

return User.create(user)

并且,改变:

Store.create(store)

return Store.create(store)

当您不返回在.then()处理程序中创建的这些承诺时,它们将成为独立的独立承诺链,并且不会链接到先前的承诺链。这通常是一个编程错误,这就是为什么Bluebird会发出警告。

当你返回它们时,它们会添加到promise链中,因此父承诺会在继续使用链之前等待它们完成。

我也建议你改变一下:

auth.hash(user.password)

为:

return auth.hash(user.password)

这样create()的来电者就可以知道一切都已完成。

并且,您只需要最高级别的一个.catch()处理程序。被拒绝的promise会自动传播到最高级别(在使用promises时更容易进行错误处理)。

答案 1 :(得分:-1)

当您没有返回请求时,这是一条警告消息。当然这似乎只是另一个警告,但是当你在大型应用程序上工作时,这将成为一个非常令人头痛的问题,因为这将导致内存泄漏,并且在重新启动应用程序或者可能会破坏服务器之前不会释放内存。

您还需要返回其他语句:

function respondWithResult(res, statusCode) {
  statusCode = statusCode || 200;
  return function(entity) {
    if (entity) {
      res.status(statusCode).json(entity);
    }else{ 
      //you should write an else statement also
      //maybe something like this
       res.status(statusCode).send(err);        
    }
  };
}

在每种情况下都会回复您的请求。