Node.js 和数据库变量中的回调 [重复]
Posted
技术标签:
【中文标题】Node.js 和数据库变量中的回调 [重复]【英文标题】:Callback in Node.js and Database variable [duplicate] 【发布时间】:2018-04-07 18:55:14 【问题描述】:我不理解 nodejs 中的回调。
我需要从数据库中获取一个播客号码并在我的代码中使用它
我现在从 console.log 得到
[Function: index]
node.js 中是否有任何解决方案可以从数据库中获取变量并稍后在代码中重用它?
var index = function( callback )
var podcast = 0;
User.findOne( sessionID: this.event.session.sessionId , function(err, user)
if (err ||!user)
else
console.log(user);
podcast = user.podcast;
);
callback( podcast );
;
index();
var callback = function(data)
return data;
var iUseMyAnywhere = callback;
【问题讨论】:
@dm03514.thanks 我让你不要立即关闭它。你为你感到骄傲吗?Happy
?
@AnnaK 简短的回答是否定的。回调在您无法预测的未来某个时间点运行,因此在其块内发生的事情仅在该块中可用。如果您希望行为更像您习惯的那样,则需要使用 Promises 以及最新 Node 版本中的新 async/await 功能。
@Paul 谢谢你 :) 你能推荐给我任何链接吗?我的情况很难实施吗?
看起来我无法回答,但这是文档。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/…
【参考方案1】:
看起来我想在 Node.js 中做的事情是不可能的
完全有可能。只是,您需要使用异步 API,这很麻烦。
node.js 中是否有任何解决方案可以从数据库中获取变量并稍后在代码中重用它?
不完全是。当您连接到数据库时 - 或者,顺便说一下,异步执行任何操作,例如通过 http 获取某些内容或从磁盘读取内容 - 您无法立即分配该事物:
var myUserFromDb = User.find('john doe', function(err, res)...); //this will fail
因为您作为第二个参数传递的该函数将在将来的某个时间执行。 User.find()
本身不返回用户。
所以,遗憾的是,您不能只在 user
变量中获取用户并将其传递给另一个模块 - 比如说播客模块 -。
但是,假设您有一个“user.js”模块,它公开了一个withUser
方法,而不是为用户查询数据库,然后与用户一起调用提供的函数,当db 调用已解决。
假设您有一个“podcast.js”文件/模块,其中包含需要用户的getPodcast
方法。
getPodcast
不能只问 'user.js' 一个用户。但是,它可以请求一个函数,该函数将在用户作为参数传递的情况下运行:
User.js
function withUser(callback)
User.find(_id: 1, (err, user)=>
callback(user);
)
podcast.js
function getPodcast()
withUser( function(user)
//now we really have the user inside podcast.js, and we can work with it.
//Sadly, that will surely involve more asynchronous api's, which is painful.
)
现在getPodcast
可以在其参数回调中访问用户。
有没有比回调更简单的方法?
是的,您应该read about promises。使用 Promise 时,事情会 - 少一些 - 痛苦。 Promise api 的工作方式如下:
User.js
function getUser(id)
//let's say we return a promise that wraps the `User.find` database request
podcast.js
getUser(userId).then(user => getPodcast(user)).then(podcastResult => ...)
这看起来并没有更好。但是,当您使用 Promise api 时,您可以开始使用 async/await。
podcast.js
async function getPodcast(userId)
const user = await User.getUser(uesrId);
const otherAsyncThing = await ...someAsyncApiCall;
doAnythingWithUser(user); //this line won't execute until user is resolved, even if there aren't callbacks involved :-D
最后一句未经询问的建议:在使用 node.js 时,请确保在编写大量代码之前了解回调 api 和异步事物的真正工作原理。否则,您将获得真正耦合且脆弱的代码,其中对象通过大量回调传递并且代码不可读且不可调试:-D
【讨论】:
【参考方案2】:附言。已编辑以关注问题。
这样想,你到了一家餐馆,坐下来向服务员要咖啡。但与此同时,你并没有被冻住,你在移动、做事、说话,所以一旦你的咖啡准备好了,女服务员就会把它拿给你,你会停止你正在做的其他事情并喝咖啡。
所以,它会变成这样:
User.findOne( sessionID: this.event.session.sessionId ).exec().then(data =>
console.log(data);
).catch(err =>
console.log(err);
);
【讨论】:
看起来我想在 Node.js 中做的事情是不可能的 :( 什么是路由器?它是一个 nodejs 模块吗?作为一个优秀的 JS 开发人员,你能告诉我什么是最好的吗?解决我的问题。我只想从数据库中获取数据并将其放入稍后在我的代码中使用的另一个变量 感谢您的帮助,但我仍然无法解决我的问题:(我又哭了 您需要创建另一个名为回调的函数以在代码中的其他位置使用您的数据。查看我的编辑。 Andy,但我不想将此变量放入控制台,我希望将其传递给另一个变量,例如播客。我希望将播客用作我在其他地方的数据库中的值。我更新了我的问题。今天你是我的英雄:) 您所要做的就是在需要使用数据时使用 return。将回调分配给示例中的变量。但就外观而言,在掌握其他关键概念之前,您正在快速移动。在转向回调之前,您需要了解编码的其他方面。对很多人来说,这是一个背包里的痛苦,这就是人们称之为回调地狱的原因。我个人讨厌它。我使用 observables 来处理它们,有时还使用 promises。但是以上是关于Node.js 和数据库变量中的回调 [重复]的主要内容,如果未能解决你的问题,请参考以下文章