Pregunta El uso de asincronización en el script de inicio de la aplicación no devuelve ningún resultado


Estoy intentando ejecutar el siguiente script en mi aplicación Node para verificar si existen usuarios y, de no ser así, crear el primer usuario administrador. Sin embargo, la secuencia de comandos simplemente no hace nada, no devuelve nada, incluso mientras se usa Try / Catch, así que, ¿alguien puede decirme qué es lo que me falta o estoy haciendo mal aquí? o ¿cómo puedo detectar el error (si hay alguno)? Gracias

import pmongo from 'promised-mongo';
import crypto from 'crypto';

const salt = 'DuCDuUR8yvttLU7Cc4';

const MONGODB_URI = 'mongodb://localhost:27017/mydb';

const db = pmongo(MONGODB_URI, {
  authMechanism: 'ScramSHA1'
}, ['users']);


async function firstRunCheckAndCreateSuperAdmin(cb) {

  const username = 'admin2@test2.com';

  try {
     const user = await db.users.findOne({ role: 'admin'});
     console.log(user);
     if(!user) return cb('No user found');
  } catch(e) {
      cb('Unexpected error occurred');
  }

  if(!user) {
    console.log('No admin detected.');

    const adminPassword = crypto.pbkdf2Sync ( 'password', salt, 10000, 512, 'sha512' ).toString ( 'hex' );
    await db.users.update({username: username}, {$set: {username: username, password: adminPassword, role: 'admin'}}, {upsert: true});
  }

  db.close();
  process.exit();
}

firstRunCheckAndCreateSuperAdmin(function(err, resultA){
    if(err) console.log(err);
});

10
2017-07-10 19:18


origen


Respuestas:


No devuelve ninguna devolución de llamada cuando no hay un usuario administrador en el siguiente fragmento de código

if (!user) {
    console.log('No admin detected.');

    const adminPassword = crypto.pbkdf2Sync ( 'password', salt, 10000, 512, 'sha512' ).toString ( 'hex' );
    await db.users.update({username: username}, {$set: {username: username, password: adminPassword, role: 'admin'}}, {upsert: true});

    // call cb(user) here
}

4
2017-07-10 19:24



Por favor mira el comentario.

import pmongo from 'promised-mongo';
import crypto from 'crypto';

const salt = 'DuCDuUR8yvttLU7Cc4';

const MONGODB_URI = 'mongodb://localhost:27017/mydb';

const db = pmongo(MONGODB_URI, {
  authMechanism: 'ScramSHA1'
}, ['users']);


async function firstRunCheckAndCreateSuperAdmin(cb) {

  const username = 'admin2@test2.com';

  try {
    const user = await db.users.findOne({
      role: 'admin'
    });
    console.log(user);
    //(1) If user is undefined, then launch cb with an error message;
    if (!user) return cb('No user found');
  } catch (e) {
    //(2) If something is wrong, then launch cb with an error message;
    cb('Unexpected error occurred');
  }

  //This part of the code will only be reached if user is defined.
  //This is a dead code as if user is undefined, it would have exited at (1)
  if (!user) {
    console.log('No admin detected.');

    const adminPassword = crypto.pbkdf2Sync('password', salt, 10000, 512, 'sha512').toString('hex');
    await db.users.update({
      username: username
    }, {
      $set: {
        username: username,
        password: adminPassword,
        role: 'admin'
      }
    }, {
      upsert: true
    });
  }

  //So if user exists, it will close db and exit without calling cb.
  db.close();
  process.exit();
}

firstRunCheckAndCreateSuperAdmin(function(err, resultA) {
  if (err) console.log(err);
});

Nota:

  • Si está utilizando async / await, entonces no necesita usar la devolución de llamada.
  • Si está utilizando la devolución de llamada, entonces no necesita tener una declaración de devolución.
  • Si se supone que la intención de la función es tener un valor de retorno, asegúrese de que todas las rutas de código devuelvan un valor.

3
2017-07-20 02:27



Intenté reescribir el código para hacerlo más pequeño y eliminar todos los tipos de devolución de llamada de estilo de nodo del código asincrónico. Reemplacé update con insertOne ya que solo tiene un usuario para insertar (no múltiples para actualizar). También he agregado 500 ms de tiempo de espera cuando llamo firstRunCheckAndCreateSuperAdmin en caso de que "cuelgue". Debería registrar algo al final :)

import pmongo from 'promised-mongo'
import crypto from 'crypto'
import {
  promisify
} from 'util'

const pbkdf2 = promisify(crypto.pbkdf2)

const salt = 'DuCDuUR8yvttLU7Cc4'

const MONGODB_URI = 'mongodb://localhost:27017/mydb'

const db = pmongo(MONGODB_URI, {
  authMechanism: 'ScramSHA1'
}, ['users']);

const username = 'admin2@test2.com'

async function firstRunCheckAndCreateSuperAdmin() {
  let user = await db.users.findOne({
    role: 'admin'
  });

  if (!user) { // no user lets create one
    user = await db.users.insertOne({
      username: username,
      password: (await pbkdf2('password', salt, 10000, 512, 'sha512')).toString('HEX'),
      role: 'admin'
    });
  }

  return user
}

const timeout = delay => message => new Promise((_, reject) => setTimeout(reject, delay, new Error(message)))

Promise
  .race([firstRunCheckAndCreateSuperAdmin(), timeout(500)('Rejected due to timeout')])
  .then(user => console.log(`Got user ${JSON.stringify(user)}`))
  .catch(error => console.error(error))

2
2017-07-11 14:27