以下代码:
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)警告:在处理程序中创建了一个承诺但未从中返回”#。我试过更改和调整代码,但错误仍然存在。
答案 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);
}
};
}
在每种情况下都会回复您的请求。