Javascript 从光纤内部返回一个值

Javascript 从光纤内部返回一个值,javascript,node.js,meteor,fibers,node-fibers,Javascript,Node.js,Meteor,Fibers,Node Fibers,我试图提供一个集合,它的方法封装在光纤中,用于同步调用 const Fiber = require('fibers'); const wrapInFiber = require('./wrapInFiber'); let db; Fiber(function () { db = wrapInFiber({ url: global.__MONGO_URI__, config: { useNewUrlParser: true, useUnifiedTopology: true

我试图提供一个集合,它的方法封装在光纤中,用于同步调用

const Fiber = require('fibers');
const wrapInFiber = require('./wrapInFiber');

let db;
Fiber(function () {
  db = wrapInFiber({
    url: global.__MONGO_URI__,
    config: { useNewUrlParser: true, useUnifiedTopology: true },
    databaseName: global.__MONGO_DB_NAME__,
    collections: ['users'],
  });
  console.log('DB', db.users);
}).run();

module.exports.Users = db.users; <-- undefined

虽然我没有解决纤维的问题,但我还是设法解决了最初的问题,这导致了流星收集的中断。只需要一个简单的过程


虽然我没有解决纤维的问题,但我还是设法解决了最初的问题,这导致了流星收集的中断。只需要一个简单的过程


哇,这看起来很复杂。你为什么需要这个?meteor中的DB收集方法已经在光纤中运行,并且是同步的。那么为什么不能直接使用Meteor.users.find()?为什么您需要自己版本的Fibre wrapped DB查询?基本上,我正在尝试为一些Meteor包编写测试,但测试在运行时没有调用包,而是导入文件,因为我们正在尝试从Meteor迁移出去,我不想添加任何Meteor相关代码,因此,我需要删除集合,以便能够调用其方法,如查找、更新等。对于上下文:我需要删除Users集合,以便能够测试角色。getUserRoles例如@HarryAdel有什么原因吗,为什么不使用
Future
类作为?您建议我如何使用它?我试过这样的东西,但没用常量光纤=需要(“光纤”);const Future=需要(“光纤/未来”);const wrapInFiber=require('./wrapInFiber');const fn=未来包裹(包裹纤维);const future=新未来();Fiber(function(){const db=fn({url:global.uu MONGO_URI_uuu,config:{useNewUrlParser:true,useUnifiedTopology:true},databaseName:global.u MONGO_db_uname,collections:['users'],}).wait();return future.return(db.users);}.run();module.exports.Users=未来```哇,这看起来很复杂。你为什么需要这个?meteor中的DB收集方法已经在光纤中运行,并且是同步的。那么为什么不能直接使用Meteor.users.find()?为什么您需要自己版本的Fibre wrapped DB查询?基本上,我正在尝试为一些Meteor包编写测试,但测试在运行时没有调用包,而是导入文件,因为我们正在尝试从Meteor迁移出去,我不想添加任何Meteor相关代码,因此,我需要删除集合,以便能够调用其方法,如查找、更新等。对于上下文:我需要删除Users集合,以便能够测试角色。getUserRoles例如@HarryAdel有什么原因吗,为什么不使用
Future
类作为?您建议我如何使用它?我试过这样的东西,但没用常量光纤=需要(“光纤”);const Future=需要(“光纤/未来”);const wrapInFiber=require('./wrapInFiber');const fn=未来包裹(包裹纤维);const future=新未来();Fiber(function(){const db=fn({url:global.uu MONGO_URI_uuu,config:{useNewUrlParser:true,useUnifiedTopology:true},databaseName:global.u MONGO_db_uname,collections:['users'],}).wait();return future.return(db.users);}.run();module.exports.Users=未来```

const Fiber = require('fibers');
const { MongoClient } = require('mongodb');

module.exports = function ({ url, config, databaseName, collections }) {
  const Collection = function (db, name) {
    this.collection = db.collection(name);
  };

  Collection.prototype.count = function (query, options) {
    query = query || {};
    options = options || {};
    const fiber = Fiber.current;
    this.collection.count(query, options, function (err, records) {
      fiber.run(records);
    });
    return Fiber.yield();
  };

  Collection.prototype.find = function (query, options) {
    query = query || {};
    options = options || {};
    const fiber = Fiber.current;
    this.collection.find(query, options).toArray(function (err, records) {
      fiber.run(records);
    });
    return Fiber.yield();
  };

  Collection.prototype.findOne = function (query, options) {
    return this.find(query, options)[0];
  };

  Collection.prototype.update = function (query, options) {
    const fiber = Fiber.current;
    this.collection.update(query, options, function (err, records) {
      fiber.run(records);
    });
    return Fiber.yield();
  };

  Collection.prototype.insert = function (document) {
    const fiber = Fiber.current;
    this.collection.insert(document, function (err, records) {
      fiber.run(records);
    });
    return Fiber.yield();
  };

  Collection.prototype.remove = function (document) {
    const fiber = Fiber.current;
    this.collection.remove(document, function (err, records) {
      fiber.run(records);
    });
    return Fiber.yield();
  };

  const fiber = Fiber.current;

  MongoClient.connect(url, config, function (err, connection) {
    const obj = {
      close() {
        connection.close();
      },
    };
    const db = connection.db(databaseName);
    collections.forEach(function (collectionName) {
      obj[collectionName] = new Collection(db, collectionName);
    });
    fiber.run(obj);
  });

  return Fiber.yield();
};

const sinon = require('sinon');
require('sinon-mongo');

const Users = sinon.mongo.collection({
  findOne: sinon
    .stub()
    .withArgs({ _id: 'user' }, { fields: { roles: 1 } })
    .returns({ _id: 'user', roles: [] }),
});

module.exports.Users = Users;