Mongoose async/await с Koa застрял на await Model.findOne().exec()

У меня есть приложение Koa 2, и запись в /signup обрабатывается этой функцией:

import User from 'models/user';

export const signup = async (ctx, next) => {
  const { email, password } = ctx.request.body;
  try {
    const existingUser = await User.findOne({ email });

    if (existingUser) {
      ctx.body = { error: 'Email is in use' };
      return next();
    }

    const user = new User({
      email,
      password,
    });
    await user.save();
    ctx.body = { success: true };
  } catch (e) {
    next(e);
  }
  return next();
};

Функция получает правильные данные, но await User.findOne().exec(); никогда не возвращается и зависает.

Я думаю, что проблема в том, что если я удаляю, код выполняется нормально. Если я переключусь на Promise, например... find().then Это тоже сработает. async/await тоже работает, потому что если я перейду на await fetch() (для эмуляции асинхронности), он сработает... но вот моя конфигурация babel

{
  "presets" : ["latest", "stage-0"],
  "plugins": [
    ["module-resolver", {
      "root": ["./src"]
    }]
  ]
}

мангуст версии 4.7.0


person Lucas Katayama    schedule 27.11.2016    source источник
comment
Ваш код не показывает, что вы используете .exec() (хотя, вероятно, это не обязательно использовать). Кроме того, вы уверены, что это не исключение? Ваш код дважды вызывает next при возникновении исключения (один раз с аргументом ошибки, а затем с return next).   -  person robertklep    schedule 27.11.2016
comment
ах извините .. скопировал старый код .. но тоже не работает ... и никаких исключений ... и уже исправил два вызова ... спасибо   -  person Lucas Katayama    schedule 27.11.2016


Ответы (2)


Я написал очень похожее приложение, но все работало нормально. Какие обещания вы используете? Я имею в виду, что вы используете собственные обещания JS или Mongoose? С обещаниями мангуста у меня были проблемы, поэтому я меняю его на нативный JS:

const mongoose = require('mongoose');

mongoose.Promise = Promise; // Use native Promises

mongoose.connect(config.get('mongoose.uri'), config.get('mongoose.options'));
...
module.exports = mongoose;
person Sergaros    schedule 04.05.2017
comment
вы не должны просить разъяснений в своем ответе, комментарии предназначены для разъяснений, если они необходимы - person Pawel Gradecki; 04.05.2017
comment
Недавно я запустил другое приложение... и теперь оно работает... Не знаю, что случилось.. Закрытие - person Lucas Katayama; 11.05.2017

Я запустил другое приложение, и теперь оно работает. Не знаю, что случилось. Возможно новая версия исправлена.

person Lucas Katayama    schedule 11.05.2017