Mongoose与Koa一起使用async/await时,在await Model.findOne().exec()处卡住

6

我有一个Koa 2 应用程序,/signup的POST请求由以下函数处理:

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也能工作,因为如果我改成等待fetch()(模拟异步),它也能工作……但这是我的babel配置。
{
  "presets" : ["latest", "stage-0"],
  "plugins": [
    ["module-resolver", {
      "root": ["./src"]
    }]
  ]
}

mongoose 的版本为 4.7.0


你的代码没有显示出使用.exec()(尽管可能不一定需要使用它)。另外,你确定它没有抛出异常吗?当发生异常时,你的代码会调用next两次(一次带有错误参数,然后带有return next)。 - robertklep
啊抱歉..我复制了一份旧代码..但是它还是无法工作...并没有任何异常...而且我已经修复了这两个调用...谢谢。 - Lucas Katayama
2个回答

0

我启动了另一个应用程序,现在它可以工作了。不知道发生了什么事情。 也许新版本修复了问题。


0

我写了一个类似的应用,但是一切正常。你用的是什么类型的承诺?我的意思是你用原生的JS承诺还是Mongoose承诺?使用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;

你应该在答案中不要询问澄清问题,如果需要澄清,则应使用评论。 - Pawel Gradecki
我最近开始了另一个应用程序...现在它正在运行...不知道发生了什么事...关闭。 - Lucas Katayama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接