当我尝试在 MongoDB 中保存时,.then 未定义

Posted

技术标签:

【中文标题】当我尝试在 MongoDB 中保存时,.then 未定义【英文标题】:.then is undefined when I try to save in MongoDB 【发布时间】:2019-05-20 03:05:42 【问题描述】:

我是 node.js 的新手。 我收到了这条消息:

TypeError: Cannot read property 'then' of undefined

代码如下:

router.post("/signup", (req, res) => 
  const userRegister = new UserRegister(
    _id: new mongoose.Types.ObjectId(),
    nickname: req.body.nickname,
    email: req.body.password,
    password: req.body.password,
    level: 0
  );
  console.log(req.body.nickname + " " + req.body.email + " " + req.body.password);
  userRegister
    .save()
    .then(doc => 
      console.log(doc);
      res.status(200).json(
        message: "User created"
      );
    )
    .catch(err => 
      if (err)
        console.log("error => " + err)
      res.status(409).json(
        message: "ERROR"
      )
    );
);

和架构:

const mongoose = require("mongoose");

const userRegister = mongoose.Schema(
  _id : mongoose.Schema.Types.ObjectId,
  nickname: String,
  email: String,
  password: String,
  level: Number
);

module.exports = mongoose.model("UserRegister", userRegister); 

我真的不明白为什么它说“.then undefined”。 (身材不错)

【问题讨论】:

UserRegister 定义在哪里? 您好!我更新了你现在可以看到的帖子 更好的缩进会让它更容易阅读 你好,在代码里! 澄清一下,“.then”不是未定义的。它告诉你你试图调用“.then”的对象是未定义的,这是一条有价值的信息。 ".then" 将在 Promise 解析后使用,因此请尝试将 UserRegister 的声明包装在 Promise 中。 【参考方案1】:

函数“save”似乎没有返回 Promise。但在源代码中它确实...... https://github.com/Automattic/mongoose/blob/master/lib/model.js#L385

您也可以尝试“创建”方法。https://github.com/Automattic/mongoose/blob/master/lib/model.js#L2646

也许会很糟糕:

   const result = new SomeModel(...);

   new Promise((resolve, reject) => 
      // Save model
      result.save(err => 
        if (err) 
          return reject(new Error(`Error with exam ersult save... $err`));
        
        // Return saved model
        return resolve(result);
      )
      .then(res => 
        return res;
      )
      .catch(err => 
        throw new Error(err);
      );

【讨论】:

我也是这么理解的。我不知道为什么它不会返回一个承诺。这对我来说开始变得复杂了,我是 nodejs 的新手,使用 .save() 在我的脑海中很干净。正如我所说,在他使用的视频中,就像我使用自己一样,并且有效。【参考方案2】:

检查模型是否是有前途的类型,如果这不是有前途的,则使用回调

mongoose promises

assert.ok(user instanceof Promise); // 这个返回 ture 或 false

router.post("/signup", (req, res) => 
      const userRegister = new UserRegister(
        _id: new mongoose.Types.ObjectId(),
        nickname: req.body.nickname,
        email: req.body.password,
        password: req.body.password,
        level: 0
      );

      console.log(req.body.nickname + " " + req.body.email + " " + req.body.password);


      var user = userRegister.save()

     assert.ok(user instanceof Promise); 

     // if assert.ok return true then use user.then 
    // else use callback  userRegister.save( function(doc) )    

      user.then(doc => 
        console.log(doc);
        res.status(200).json(
          message: "User created"
        );
      )
      .catch(err => 
        if (err)
          console.log("error => " + err)
        res.status(409).json(
          message: "ERROR"
        )
      );
    );

【讨论】:

在我跟随的tuto中,他不使用assert或任何类似的东西。它就像我写的那样有效。你可以在这里看到它在 15m57 youtube.com/… 我不知道断言的目标是什么。我在看【参考方案3】:
router.post("/signup", async (req, res) => 
    try
        const userRegister = await UserRegister.create(
            _id: new mongoose.Types.ObjectId(),
            nickname: req.body.nickname,
            email: req.body.password,
            password: req.body.password,
            level: 0
        );
    
    catch(err)
        console.log("error => " + err)
        res.status(409).json(
        message: "ERROR"
        )
    

    console.log(userRegister);
    res.status(200).json(
        message: "User created"
    );
);

【讨论】:

您好,谢谢您的回答。它应该可以工作,但我想要带有 .then 的版本来回答它是如何工作的。我已经知道等待了! @dun32 不,他们没有。它不会在router.post() 之前出现。

以上是关于当我尝试在 MongoDB 中保存时,.then 未定义的主要内容,如果未能解决你的问题,请参考以下文章

我无法使用 Mongoose 在 MongoDB 中保存或查找文档

我定义了嵌套模式,当我填充输入时它啥也不返回,也不保存在 Mongodb

类型“RelayObservable<unknown>”上不存在属性“then”。当我尝试在反应中使用中继获取数据时。我不知道为啥会出现这个错误

mongodb 将数据保存在两个地方

当我尝试在 MongoDB 数据库中上传图像时,出现 multer 错误

MongoDB 的奇怪日期行为