123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- const h = require('../helper');
- const MongoClient = require('mongodb').MongoClient;
- let collectionsMaybe = null, connecting = false, connectionCallbacks = [];
- const mongoUrl = 'mongodb://tfb-database:27017';
- const dbName = 'hello_world';
- /**
- * Note! The benchmarks say we should use "id" as a property name.
- * However, Mongo provides a default index on "_id", so to be equivalent to the other tests, we use
- * the same, default index provided by the database.
- *
- */
- const getCollections = async () => {
- // mongoose creates a queue of requests during connection, so we don't have to wait.
- // however, with the raw driver we need to connect first, or sometimes the test will fail randomly
- if (collectionsMaybe) {
- return collectionsMaybe;
- }
- if (connecting) {
- const promise = new Promise((resolve) => {
- connectionCallbacks.push(resolve);
- });
- return await promise;
- }
- connecting = true;
- const client = await MongoClient.connect(mongoUrl);
- collectionsMaybe = {
- World: null,
- Fortune: null
- };
- collectionsMaybe.World = client.db(dbName).collection('world');
- collectionsMaybe.Fortune = client.db(dbName).collection('fortune');
- // resolve pending requests in buffer
- for (const callback of connectionCallbacks) {
- callback(collectionsMaybe);
- }
- return collectionsMaybe;
- }
- const toClientWorld = (world) => {
- if (world) {
- world.id = world._id;
- delete world._id;
- }
- return world;
- };
- const mongodbRandomWorld = async () => {
- const collections = await getCollections();
- return toClientWorld(await collections.World.findOne({
- _id: h.randomTfbNumber()
- }));
- };
- const mongodbGetAllFortunes = async () => {
- const collections = await getCollections();
- return (await collections.Fortune.find({}).toArray()).map(toClientWorld);
- };
- async function getUpdateRandomWorld() {
- const collections = await getCollections();
- const world = await collections.World.findOne({
- _id: h.randomTfbNumber()
- });
- world.randomNumber = h.randomTfbNumber();
- await collections.World.updateOne({
- _id: world._id
- }, {
- $set: {
- randomNumber: world.randomNumber
- }
- })
- return toClientWorld(world);
- }
- module.exports = {
- SingleQuery: async (req, res) => {
- const result = await mongodbRandomWorld();
- h.addTfbHeaders(res, 'json');
- res.end(JSON.stringify(result));
- },
- MultipleQueries: async (queryCount, req, res) => {
- const queryFunctions = [];
- for (let i = 0; i < queryCount; i++) {
- queryFunctions.push(mongodbRandomWorld());
- }
- const results = await Promise.all(queryFunctions);
- h.addTfbHeaders(res, 'json');
- res.end(JSON.stringify(results));
- },
- Fortunes: async (req, res) => {
- const fortunes = await mongodbGetAllFortunes();
- fortunes.push(h.additionalFortune());
- fortunes.sort(function (a, b) {
- return a.message.localeCompare(b.message);
- });
- h.addTfbHeaders(res, 'html');
- res.end(h.fortunesTemplate({fortunes}));
- },
- Updates: async (queryCount, req, res) => {
- const promises = [];
- for (let i = 1; i <= queryCount; i++) {
- promises.push(getUpdateRandomWorld());
- }
- h.addTfbHeaders(res, 'json');
- res.end(JSON.stringify(await Promise.all(promises)));
- }
- };
|