【问题标题】:JavaScript async/await: await is a reserved word [duplicate]JavaScript async/await:await 是保留字 [重复]
【发布时间】:2018-04-13 03:52:57
【问题描述】:

这是一个检查 mongoose 是否有重复记录的函数。在这种情况下,nameemail 是唯一字段,因此如果数据库中存在具有相同名称或电子邮件的记录,则无法插入新记录:

const checkIfDatabaseHasUsersWithSameNameAndEmail = async () => {

    uniques = ['name', 'email'];
    uniques.map((field) => {
        let query = {};
        query[field] = data[field];
        query.deleted = false;
        let result = await model.findOne(query); <== ERROR: await is a reserved word

        if (result) {
            errors.push({
                field: field,
                message: 'A record already exists in database for ' + field + '=' + data[field]
            });
        }
    });

    if (errors.length > 0)
        return errors;
}

schema.statics.create = function (data) {

    let errors = await checkIfDatabaseHasUsersWithSameNameAndEmail(); <== ERROR: await is a reserved word

    if (errors)
        throw new Error(errorMessages);

    let company = new this(data);
    return company.save();
}

运行时,我在代码中发现以下错误:await is a reserved word

这是我第一次使用 async/await,所以可能我用错了方法。我的目标是按顺序运行唯一的测试(findOne),如果一切顺利,保存新的寄存器。

【问题讨论】:

  • 你在传递给.map()的非异步回调中使用await
  • 您实际使用的匿名函数await未声明async
  • 是的。范围问题。
  • 感谢所有 cmets,但是...我应该在代码中修复什么?
  • @Mendes 你能告诉我们这应该做什么吗?你期待findAny 给你回东西吗?如果是,它应该返回什么?

标签: javascript node.js mongoose async-await


【解决方案1】:

这个错误是因为你试图等待一些东西,但没有声明函数异步。我没有用猫鼬对此进行测试,但它看起来像这样。

async function checkIfDatabaseHasUsersWithSameNameAndEmail(data) {
  const uniques = ['name', 'email'];
  return Promise.all(uniques.map(async (field) => {
    const query = {};
    query[field] = data[field];
    query.deleted = false;
    return model.findOne(query);
  }));
}

schema.statics.create = async function create(data) {
  try {
    const results = await checkIfDatabaseHasUsersWithSameNameAndEmail(data);
    results.forEach((result) => {
      console.log(`Here's the issue: ${JSON.stringify(result)}`);
      throw new Error('Do something about it.');
    });

    const company = new this(data);
    return company.save();
  } catch (error) {
    throw error;
  }
};

【讨论】:

  • 这将使映射器函数返回Promise's ...
  • 然后您可以方便地将其传递给 Promise.all
猜你喜欢
  • 2018-11-08
  • 2016-04-12
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多