Javascript (节点:5540)警告:已在处理程序中创建承诺,但未从中返回
以下代码:Javascript (节点:5540)警告:已在处理程序中创建承诺,但未从中返回,javascript,node.js,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(e
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)警告:已在处理程序中创建承诺,但未从中返回”。我尝试过更改和调整代码,但错误仍然存在 当您不返回请求时,这是一条警告消息。当然,这似乎只是另一个警告,但当你在一个大的应用程序上工作时,这会成为一个非常令人头痛的问题,因为这会导致内存泄漏,并且在你重新启动应用程序之前不会释放内存,或者可能会压坏你的服务器 您还需要返回其他状态:
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);
}
};
}
在任何情况下都返回您的请求。当您不返回请求时,这是一条警告消息。当然,这似乎只是另一个警告,但当你在一个大的应用程序上工作时,这会成为一个非常令人头痛的问题,因为这会导致内存泄漏,并且在你重新启动应用程序之前不会释放内存,或者可能会压坏你的服务器 您还需要返回其他状态:
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);
}
};
}
在任何情况下都返回到您的请求。此警告是因为您的代码正在
.then()
处理程序中创建承诺,但没有从这些处理程序返回承诺
更改:
User.create(user)
致:
以及,改变:
Store.create(store)
到
如果不返回在.then()
处理程序中创建的这些承诺,它们将成为独立的承诺链,并且不会链接到以前的承诺链。这通常是一个编程错误,这就是为什么蓝鸟会发出警告
当您返回它们时,它们会添加到承诺链中,因此父承诺会等待它们的完成,然后再继续使用该链
我还建议您可能想要更改:
auth.hash(user.password)
致:
这样,create()
的调用者就可以知道什么时候一切都完成了
而且,您只需要一个最高级别的
.catch()
处理程序。被拒绝的承诺会自动传播到顶层(这是使用承诺时更容易处理错误的原因之一)。此警告是因为您的代码正在.then()
处理程序中创建承诺,但不会从这些处理程序返回承诺
更改:
User.create(user)
致:
以及,改变:
Store.create(store)
到
如果不返回在.then()
处理程序中创建的这些承诺,它们将成为独立的承诺链,并且不会链接到以前的承诺链。这通常是一个编程错误,这就是为什么蓝鸟会发出警告
当您返回它们时,它们会添加到承诺链中,因此父承诺会等待它们的完成,然后再继续使用该链
我还建议您可能想要更改:
auth.hash(user.password)
致:
这样,create()
的调用者就可以知道什么时候一切都完成了
而且,您只需要一个最高级别的
.catch()
处理程序。被拒绝的承诺会自动传播到顶层(这是使用承诺时更容易处理错误的原因之一)。您是否尝试返回auth.hash
?刚刚尝试过,但遗憾的是,它仍然产生相同的错误。实际上有很多未返回的承诺。这只是一个警告,但也可能是一个错误。也没有必要做三次捕捉,你可以把它放在最后(但你必须回报承诺)。好吧,你需要回报所有的承诺。这意味着返回User.create(…)
,返回Store.create(…)
和返回auth.hash(…)
您是否尝试过返回auth.hash
?刚刚尝试过,但遗憾的是仍然产生了相同的错误。实际上,那里有很多未回复的承诺。这只是一个警告,但也可能是一个错误。也没有必要做三次捕捉,你可以把它放在最后(但你必须回报承诺)。好吧,你需要回报所有的承诺。这意味着return User.create(…)
,return Store.create(…)
和return auth.hash(…)
我可以问一下为什么我得到-1吗?因为你的答案与所问的问题毫无关系。你基本上做了同样的事情User.create(User)User.create(User)
到return User.create(User)
返回到请求我指出了OP代码中导致此警告的两行代码,并解释了此警告存在的原因。你两个都没有。这不是从函数返回的一般问题,而是从.then()
处理程序中返回承诺的具体问题。我可以问一下为什么得到-1吗?因为您的答案与所问的问题无关。您基本上做了相同的事User.create(User)User.create(User)
toreturn User.create(User)
returning to a request我指出了OP代码中导致此警告的两行代码,并解释了此警告存在的原因。你两个都没有。这不是从函数返回的一般问题,而是从.then()
处理程序中返回承诺的具体问题。