如何更新猫鼬特定的值,而无需将其他值转换为null?

时间:2019-11-25 18:56:38

标签: javascript node.js express mongoose postman

我试图更新集合中的值,但我想让它正常工作的唯一方法是一起更新整个值,如果我更新一个值,则如果排除更新文件(图像)会导致错误,则其余值将为空。

1)upading whole values sucess

1-2))mongoose

2) when image excluded "Cannot read property 'originalname' of undefined"

3)when updating image only rest of values converted to null

模型

const mongoose = require ("mongoose");
const user = require('../models/usermodel')
const Schema = mongoose.Schema;
const sellerSchema= mongoose.model('seller',new mongoose.Schema({
image:{type:String,
    required:true}
password:{type:String,
          required:true}
lastName:{type:String,
          required:true}
name:{type:String,
      required:true}
numTel:{type:Number,
        required:true}
email:{type:String,
       required:true}
}))
module.exports = sellerSchema;

控制

const sellermodel = require('../models/sellermodel');

var fs = require('fs');

const multer = require('multer');

const upload = multer({dest:__dirname +'/uploads/images'});

module.exports = {sellerupdate: function (req, res) {

sellermodel.updateOne({_id: req.params.id},

        {$set:{name:req.body.name,

        lastName:req.body.lastName,

        email:req.body.email,

        password:req.body.password,

        image:req.file.originalname,}},

        function (err,data) {

        if (err) {res.json({ msg: 'product not found'+err })
        }
        else {
          res.json({ msg: 'product updated successfully'+data} )
        }

    })
  }
}

路由器

 const sellercontrols = require("../controllers/sellercontrols");

 const router = require("express").Router();

 const multer = require('multer');

 const upload = multer({dest:__dirname + '/uploads/images/'});

 router.put('/update/:id',upload.single('image'),sellercontrols.sellerupdate);

 module.exports = router;

服务器

const express = require('express');

const app = express();

const bodyParser = require("body-parser");

const sellerrouter= require('./routers/sellerrouter');

const db = require('./models/db');

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({

extended: false }));

app.use("/seller",sellerrouter);

app.listen(8080,function(){

console.log('server is running')})

请帮助

3 个答案:

答案 0 :(得分:1)

///这是您一直在寻找的答案,我花了一个小时试图找出答案。如果电子邮件和密码在对象中,请使用第一种语法;否则请使用较短的

const password = "new password";
const email = "new email"; 
let result = collection find({})
result  =  result.objectName

//现在像这样更新结果对象中的电子邮件和密码

result.email = email;
result.password = password

//之后将其发送回数据库

collection.updateOne({}, {$set: {fieldName: result}})

//就是这样,如果不在对象中,则使用较短的那个

collection.findOneAndUpdate({}, {$set: {email, password}})

如果电子邮件和密码在对象内部,请使用此

答案 1 :(得分:0)

说起来容易,因为您正在使用$set,因此如果您不传递值,它将默认为null,然后在文档{{ 1}}。当您要null多个字段(可以是1或2或整个文档)时,您需要具有故障保存系统,以便对于未更改的值保留原始值。

这就是我要处理此问题的方式

1)找到我要更新的文档update

2)将(sellermodel.FindOne)Object Returned进行比较,更新已更改的内容,如果未更改,则保留原始内容(因此解决了passed Object问题)

3)使用null

用新值更新Object

我认为这是可行的,但我没有对其进行测试,因此您可能需要在此处和此处进行一些更改

(sellermodel.updateOne)

答案 2 :(得分:0)

在您的查询中,您正在从req.body获取所有值并将其传递给$set,所以我认为当您不为特定字段发送值时,它默认为null,因此所有值都更新为null。

如果您不希望其他值更改为null,则必须从集合中获取以前的值,并在表单中进行填充,以便在提交时可以在req.body中访问。在邮递员中,您必须将现有值与要更新的值一起传递,或者如果该值为null,则不要将其传递给$set

如果您不想执行这两个步骤中的任何一个,那么另一种方法是:

sellermodel.findById({
   _id: req.params.id
}, function (err, docs) {
   if(err){ do something }
   else{
     let name = req.body.name,
         lastName = req.body.lastName,
         email = req.body.email,
         password = req.body.password;
     if(name == null || name == ''){
        name = docs.name;
     }
     if(lastName == null || lastName == ''){
        lastName = docs.lastName;
     }
     if(email == null || email == ''){
        email = docs.email ;
     }
     if(password == null || password == ''){
        password = docs.password;
     }

     //then your options will look like
     let options;
     if(req.file != undefined){
      options = {
         name: name,
         lastName: lastName,
         email: email,
         password: password,
         image: req.file.originalname
      }
     } else {
      //Not passing the image here will not change the existing value in your document.
      options = {
         name: name,
         lastName: lastName,
         email: email,
         password: password
      }
     }
     //your update query
     sellermodel.updateOne({_id: req.params.id},{$set:options}, 
     function (err,data) {
       if (err) {
         res.json({ msg: 'product not found'+err })
       } else {
         res.json({ msg: 'product updated successfully'+data} )
       }
     })
   }
})

对于req.file.originalname,显然会抛出您在其中一张屏幕快照中显示的错误,因为未定义req.file,因为您未传递任何内容。我建议您定义选项以更新方式。我已经在上面显示了。