【问题标题】:Mongoose async/await with Koa get stuck on await Model.findOne().exec()Mongoose async/await with Koa 卡在 await Model.findOne().exec()
【发布时间】:2017-05-11 19:53:34
【问题描述】:

我有一个 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 版

【问题讨论】:

  • 你的代码没有显示你使用.exec()(尽管它可能不是绝对必须使用它)。另外,您确定它不会引发异常吗?发生异常时,您的代码会调用两次next(一次使用错误参数,然后使用return next)。
  • 啊抱歉..复制了一个旧代码..但也不起作用...也没有例外...并且已经修复了两个调用...谢谢

标签: node.js mongoose async-await babeljs koa2


【解决方案1】:

我编写了非常相似的应用程序,但一切正常。你使用什么类型的承诺?我的意思是你使用原生 JS 承诺或猫鼬承诺?有了猫鼬的承诺,我遇到了问题,所以我将其更改为原生 JS:

const mongoose = require('mongoose');

mongoose.Promise = Promise; // Use native Promises

mongoose.connect(config.get('mongoose.uri'), config.get('mongoose.options'));
...
module.exports = mongoose;

【讨论】:

  • 你不应该在你的回答中要求澄清,如果需要的话,cmets 是为了澄清
  • 这几天我又启动了另一个应用程序......现在它正在工作......不知道发生了什么......正在关闭
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 2017-10-21
    • 2018-12-28
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多