在app启动脚本中使用async不返回任何结果

时间:2017-07-10 19:18:36

标签: javascript node.js

我正在尝试在我的节点应用程序中运行以下脚本以检查是否存在任何用户,如果不存在,则创建第一个管理员用户。然而,脚本什么也不做,即使在使用Try / Catch时也没有任何回报,所以有人可以告诉我在这里我错过了什么/做错了吗?或者我怎么可能发现错误(如果有的话)?感谢

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);
});

3 个答案:

答案 0 :(得分:4)

如果以下代码段中没有管理员用户,则不会返回任何回调

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
}

答案 1 :(得分:3)

请参阅评论。

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);
});

注意:

  • 如果您使用async / await,那么您不需要使用回调。
  • 如果您正在使用回调,那么您不需要返回声明。
  • 如果函数的意图是假设有返回值,请确保所有代码路径都返回一个值。

答案 2 :(得分:2)

我试图重写您的代码以使其更小并从中删除所有节点样式的异步代码类型。我将Error: derived uses undefined class Derived. 替换为update,因为您只有一个用户要插入(而不是多个要更新)。此外,我在调用insertOne时添加了500毫秒超时,以防#34;挂起"。它应该在最后记录一些东西:)

firstRunCheckAndCreateSuperAdmin