Javascript 膝关节炎的函数

Javascript 膝关节炎的函数,javascript,node.js,mongoose,koa,Javascript,Node.js,Mongoose,Koa,我有一个函数,可以从数据库中提取问题集合中的随机问题 Game_Questions.js-console.log下面打印出正确的值(我需要的字符串),所以我认为return会让yield返回相同的值 exports.random_Question = function *() { yield Questions.findRandom().limit(1).exec(function(err,question){ console.log("rand q: " + question[

我有一个函数,可以从数据库中提取问题集合中的随机问题

Game_Questions.js-console.log下面打印出正确的值(我需要的字符串),所以我认为return会让yield返回相同的值

exports.random_Question = function *() {
   yield Questions.findRandom().limit(1).exec(function(err,question){
     console.log("rand q: " + question[0].text);
     return question[0].text;
   });
}
Game.js:

var Game_Questions = require('./backend/Game_Questions');
在这里,我想访问上面代码片段(Game_Questions.js)中的
question[0]。text
value from
random_question
函数。到目前为止,我所尝试的:

var found_Question=Game_Questions.random_Question()

var found\u Question=Game\u Questions.random\u Question().next().value

这两个函数返回[Object Object],在使用JSON.stringify()后,它显示该对象是:
{“value”:{“emitter”:{“domain”:null,{u events”:{}},“emitted”:{},“end”:true},“done”:false}


我还尝试使用
co(function*())
,但它也不允许我取出值。请帮助访问它?

你的语法很奇怪,但不确定这是否是膝关节炎的特殊性?

由于Node.js是基于事件的,因此请改用回调:

exports.random_Question = function(callback) {
    Questions.findRandom().limit(1).exec(function(err, question){
        callback(err, question);
    });
}
并使用它:

var Game_Questions = require('./backend/Game_Questions');
Game_Questions.random_Question(function(err, question) {
    console.log(question);
});

有些问题,你的问题是你试图引用<代码> GAMYQUEST。随机疑问()/>代码>当你的函数实际上被命名为代码> RealthyQuest[</C> > > < /P> < P> > @ ReMUS的答案是回调方法,膝关节炎被明确地设计为去回退。因此,虽然它是一个非常好的代码,适合于一个快速的应用程序,但它完全与膝关节炎的设计理念不一致。 从外观上看,您使用的是Mongoose,它从4.0版(2015年4月发布)开始就支持异步操作,这应该允许采用收益率方法。请注意,我假设您正在与猫鼬合作-我希望我没有错

因此,首先确保您使用的是支持使用yield的Mongoose版本。如果没有,您将不得不使用@remus方法或手动包装您的每个方法,以使它们与产量兼容(即使用承诺包装)

但是,如果您使用的是兼容版本(4.0及以上),那么您的代码将如下所示:

exports.random_Question = function *() {
  var result;

  try {
    result = yield Questions.findRandom().limit(1).exec();
  } catch(e) {
    console.log(e.stack);
    throw e;
  }

  console.log("rand q: " + result[0].text);
  return result[0].text;
}
注意,我假设结果是基于您提供的代码的数组

上面的例子不一定是一个生成器函数。它也可以是一个返回承诺的普通函数。因此,也可以做类似的事情:

exports.random_Question = function() {
  return Questions.findRandom()
    .limit(1)
    .exec()
    .then(function() {
      // I'm assuming mongoose assigns the value
      // being resolved in exec() to 'this'
      var question = this[0];
      console.log("rand q: " + question.text);
      return question.text;
    }).catch(function(e) {
      console.log(e.stack);
      throw e;
    });
}
<> P> >对于<代码>随机化问题< /C>函数,重要的是它可以由 CO.<代码>产生,它处理膝关节炎应用程序流控制——检查您可以产生的不同对象。 <>最后,回到膝关节炎中间件,我们可以用完全相同的方式<代码>屈服率>代码段。所以我们要做:

var koa = require("koa");
var app = module.exports = koa();
var Game_Questions = require('./backend/Game_Questions');

app.use(function*() {
  var resultText;

  try {
      resultText = yield Game_Questions.random_Question();
  } catch(e) {
    this.throw(500);
  }

  this.body = resultText;
  this.status = 200;
});

app.listen(3000);
另外需要注意的是,我有点不确定mongoose查询中的
findRandom
方法,因为我不知道它是否与mongoose的Promise特性配合得很好。就我个人而言,在重新引入
findRandom
之前,我会使用
yield
实现一个正常的mongoose查询,以确保它不会引起问题


我的答案在这一点上有点长了,所以我就到此为止。

嗨,非常感谢@remus,我犯了严重的语法错误,所以是的,应该有随机的问题,但它给了我
[对象]
。当我尝试您的解决方案时,questionText未定义,可能是因为console.log在
random\u Question()
之前运行。如果
Question[0].text不存在,这将导致未定义。当您在
findRandom()
的回调函数中记录
question
时会发生什么情况?然后它会记录正确的值-在您的解决方案和我的示例中,以及生成器函数中@雷姆斯哇,你太棒了!:)它就像一个符咒。谢谢。很抱歉,我的语法很奇怪,仍在进行基础工作。您将始终需要使用回调,因为它是异步的
co(Game_Questions())
应该会返回一个关于iirc值的承诺。您好@Peadar Doyle,您说得对,我在我的项目中运行Mongoose,它是4.0.7版本,所以应该支持yield。我之所以使用
questions[0].text
是因为
questions
是一个对象的猫鼬数组,我想要“text”的值,所以我想我可以通过这种方式访问它。我尝试了您的解决方案,但我不确定如何在另一个文件中调用此函数<代码>游戏问题。随机问题().next().value
变量博弈问题。随机问题() CO/< COD> > <代码>生成器< /> >和承诺> /COD> COA中的工作是学习膝关节炎的最严峻挑战。不幸的是,这些也提供了所有的优势,膝关节炎;所以你不能掩饰它们。谢谢你提供了非常翔实的答案。我可以看到我现在面临的问题——我的示例(Game.js文件)只是整个方法的一个片段,其中包含许多标准(而不是生成器)函数。我知道我应该用膝关节炎标准来做,所以我现在不会面对这个问题。我将尝试重写我的函数,并用结果更新您。谢谢你的乳液我印象深刻,它真的很有效。两个答案都是正确的,但你的答案显然更好,因为koa风格和使用发电机。谢谢。如果有人感兴趣,你可以。