我试图更新集合中的值,但我想让它正常工作的唯一方法是一起更新整个值,如果我更新一个值,则如果排除更新文件(图像)会导致错误,则其余值将为空。
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')})
请帮助
答案 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,因为您未传递任何内容。我建议您定义选项以更新方式。我已经在上面显示了。