mongoose update操作 Nodejs中post出现302

mongoose update操作 Nodejs中post出现302

前端表单提交: 后端进行数据库更新操作: var name = req.body.groupname; var mail = req.body.mailbox; var description = req.body.descriptions; GroupModel.update({groupname:name},{ $set: {mailbox:mail}, $set: {descriptions : description}, },{safe: false, multi: true},function(err,doc){ if(err) { req.flash(‘error’,‘修改失败’); return res.redirect(’/update’); } else { req.flash(‘success’,‘信息修改成功’); res.redirect(’/update’); }; }); 前端提交表单后页面显示:信息修改成功 但是数据库中数据没有变化,(更新失败) 控制台日志 post /update 302 求解答!数据库更新操作有错误吗?


2 回复

在你的描述中,问题主要集中在使用 Mongoose 进行数据库更新操作时遇到了 HTTP 状态码 302,这通常意味着重定向。另外,你提到的更新操作可能存在问题,因为你在 update 方法中重复使用了 $set 操作符。

分析与解决方案

1. 重复的 $set 操作符

在你的 update 操作中,你重复使用了 $set 操作符。正确的做法是将所有需要更新的字段放在一个对象中:

GroupModel.update(
  { groupname: name }, // 查询条件
  { $set: { mailbox: mail, descriptions: description } }, // 更新对象
  { safe: false, multi: true }, // 选项
  function (err, doc) {
    if (err) {
      req.flash('error', '修改失败');
      return res.redirect('/update');
    } else {
      req.flash('success', '信息修改成功');
      res.redirect('/update');
    }
  }
);

2. HTTP 302 状态码

HTTP 302 状态码表示临时重定向。在你的场景中,这可能是由于路由配置或重定向逻辑导致的。确保你的路由配置正确,并且没有不必要的重定向逻辑。

示例代码

假设你有一个简单的 Express 路由处理程序来处理表单提交:

const express = require('express');
const mongoose = require('mongoose');
const GroupModel = require('./models/Group'); // 假设你已经定义了 GroupModel

const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// 处理表单提交
app.post('/update', async (req, res) => {
  const { groupname, mailbox, descriptions } = req.body;

  try {
    const result = await GroupModel.updateOne(
      { groupname },
      { $set: { mailbox, descriptions } }
    );

    if (result.nModified > 0) {
      req.flash('success', '信息修改成功');
    } else {
      req.flash('error', '未找到匹配的记录');
    }

    res.redirect('/update');
  } catch (err) {
    req.flash('error', '修改失败');
    res.redirect('/update');
  }
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

解释

  1. 更新操作:我们使用 updateOne 方法来更新单个文档。如果你需要更新多个文档,可以使用 updateMany
  2. 错误处理:通过检查 result.nModified 来判断是否有文档被更新。
  3. 重定向:根据操作结果重定向到 /update 页面,并设置相应的闪现消息。

通过这些调整,你应该能够解决遇到的问题。如果仍然有问题,请检查你的路由配置和中间件是否正确。


根据你的描述,问题可能出在 GroupModel.update 方法的使用上。Mongoose 的 update 方法需要正确设置查询条件和更新字段。同时,HTTP 状态码 302 表明发生了重定向,这可能是由于前端的表单提交方式或路由配置导致的。

以下是正确的更新代码示例,并确保路由不会发生不必要的重定向:

示例代码

const express = require('express');
const mongoose = require('mongoose');
const GroupModel = require('./models/Group'); // 假设你已经定义了GroupModel

const app = express();
app.use(express.urlencoded({ extended: true }));

app.post('/update', async (req, res) => {
    try {
        const { groupname, mailbox, descriptions } = req.body;

        const result = await GroupModel.findOneAndUpdate(
            { groupname }, // 查询条件
            { $set: { mailbox, descriptions } }, // 更新字段
            { new: true, runValidators: true } // 配置选项
        );

        if (!result) {
            return res.status(404).send('未找到匹配的文档');
        }

        req.flash('success', '信息修改成功');
        res.redirect('/update');

    } catch (err) {
        console.error(err);
        req.flash('error', '修改失败');
        res.redirect('/update');
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. ** findOneAndUpdate**:这是 Mongoose 提供的一个方法,用于查找并更新一个文档。相比 update 方法,它更简洁且功能强大。

    • { groupname } 是查询条件。
    • { $set: { mailbox, descriptions } } 是更新操作。
    • { new: true, runValidators: true } 确保返回最新的文档,并运行验证规则。
  2. 路由处理:确保 POST 请求正确处理,并根据结果返回适当的响应。

  3. 避免重定向问题:如果更新失败,确保使用适当的 HTTP 状态码和错误消息。

通过这种方式,可以确保更新操作正确执行,并避免因错误配置引起的重定向问题。

回到顶部