【问题标题】:getting error "user.save is not a function" while trying to update a doc尝试更新文档时出现错误“user.save 不是函数”
【发布时间】:2023-04-10 20:10:01
【问题描述】:

我正在根据代码更新一个文档

var express = require('express');
var router = express.Router();
var user = require('./user');

router.put('/:username/email',
    function(req, res, next) {
        console.log("control check");
        next();
    },
    email.acquire,
    function(req, res) {
        console.log("control check");
        var username = req.params.username;
        var address = req.body.email;
        console.log(address);
        user.find({
            'username': username
        }, function(err, user) {
            if (err) {
                throw (err);
                console.log('ERROR WHILE PUT EMAIL');
            } else {
                console.log('success while PUT email');
                user.email = address;
                user.save(function(err, updatedUser) {
                    if (err) throw (err);

                    res.status(200).send(updatedUser)
                });
            }
        });
    });

module.exports = router;

但我得到了错误:

events.js:183 投掷者; // 未处理的“错误”事件 ^

TypeError: user.save 不是函数

user.js 的代码是

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var userSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    username: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    }
});

var user = mongoose.model('user', userSchema);

module.exports = user;

我已经尝试从模型中创建一个对象,但无济于事。

是的,存在一个名为“用户”的集合。

【问题讨论】:

  • 另外,您在 db 中的集合名称将是 users 而不是 user

标签: javascript node.js mongodb mongoose


【解决方案1】:

从find() 回调返回的user 将是一个猫鼬文档数组,这就是它抱怨的原因。要么使用 findOne() 方法返回具有保存方法的单个 Mongoose 文档,要么使用 findOneAndUpdate() 进行原子更新。

您还需要明确变量命名,因为您有重复的 user 变量,一个用于 mongoose 模型,另一个用于回调参数。

使用 findOneAndUpdate() 如下:

user.findOneAndUpdate(
    { 'username': username }, 
    { '$set': { 'email', address } },
    { 'new': true /*, 'upsert': true */ }
    function(err, updatedUser) {
        if (err) {
            throw (err);
            console.log('ERROR WHILE PUT EMAIL');
        } else {
            console.log('success while PUT email');
            res.status(200).send(updatedUser)
        }
    }
);

【讨论】:

    【解决方案2】:

    User.find 返回结果数组,使用 findOne。不要使用会造成混淆的相同变量名。

    user.findOne({
        'username': username
    }, function (err, userData) {
        if (err) {
            throw (err);
            console.log('ERROR WHILE PUT EMAIL');
        } else {
            if (userData) {
                console.log('success while PUT email');
                userData.email = address;
                userData.save(function (err, updatedUser) {
                    if (err) throw (err);
    
                    res.status(200).send(updatedUser)
                });
            }else{
                res.status(200).send('Some response')
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      相关资源
      最近更新 更多