简体   繁体   English

nodejs multer 使用 mongodb 编辑上传的文件

[英]nodejs multer edit a uploaded file with mongodb

i have a website where you can upload files.我有一个网站,您可以在其中上传文件。 but i want that you can edit them too.但我希望你也可以编辑它们。 that means the user can press edit en put a new file in and it changes the file on the database.这意味着用户可以按 edit en 放入一个新文件,它会更改数据库中的文件。 with normal text you can do findByIdAndUpdate.使用普通文本,您可以执行 findByIdAndUpdate。 but with a async function youcan.但是使用异步 function 你可以。 so my question is how can i do this.所以我的问题是我该怎么做。

here is my code for uploaden这是我的上传代码

var storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "uploads");
  },
  filename: (req, file, cb) => {
    cb(null, file.fieldname + "-" + Date.now() + ".png");
  },
});

var upload = multer({ storage: storage });

router.use(flash())

router.get("/create", (req, res) => {
  res.render("uploadPicture", {
    items: items,
    user: req.auth,
    title: "Upload",
  });
});

router.get("/", (req, res) => {
  image.find({}, (err, items) => {
    if (err) {
      console.log(err);
      res.status(500).send("An error occurred", err);
    } else {
      res.render("uploadPicture", {
        errMsg: req.flash('image'),
        items: items,
        user: req.auth,
        title: "pictures",
      });
    }
  });
});


router.post("/upload", upload.single("image"), async (req, res, next) => {
  //const userid = await user.findById({_id : userid});
  //console.log(userid);'
  const { folder } = sanitize(req.body);
  var obj = {
    name: req.body.name,
    userId: req.auth.userId,
    folder: folder,
    img: {
      data: fs.readFileSync(
        path.join(__dirname, "../uploads/" + req.file.filename )
      ),
      contentType: "image/png",
    },
  };
  image.create(obj, (err, items) => {
    if (err) {
      console.log("Test")
      console.log(err);
      req.flash('image', 'Image failed to upload!')
      res.redirect("/picture")
    } else {
      console.log(obj);
      items.save();
      req.flash('image', 'Image succesfully uploaded!')
      res.redirect("/picture")
    }
  });
});

module.exports = router;

and here is what it tried myself but didnt work because i get the error: TypeError: Cannot read property 'findByIdAndUpdate' of undefined这是它自己尝试但没有成功的方法,因为我收到错误:TypeError: Cannot read property 'findByIdAndUpdate' of undefined

router.post("/edit/:id", upload.single("image"), async(req, res ) =>{
  const id = req.params.id;
  console.log(req.params.id)
  const { folder } = sanitize(req.body);
  var obj = {
    name: req.body.name,
    userId: req.auth.userId,
    folder: folder,
  };
  if(req.body.image == ""){
    console.log("nothing here")
    image.findByIdAndUpdate(id, {name: req.body.name,folder: folder,}, function(err, docs){
      if (err) {
        console.log(err);
        req.flash('image', 'Image failed to upload!')
        res.redirect("/picture")
      } else {
        console.log(obj);
        req.flash('image', 'Image succesfully uploaded!')
        res.redirect("/picture")
      }
    })
  }else{
  var image = {
      img: {
        data: fs.readFileSync(
          path.join(__dirname, "../uploads/" + req.file.filename )
        ),
        contentType: "image/png",
      },
   }
   image.findByIdAndUpdate(id, {name: req.body.name,folder: folder,image: image}, function(err, docs){
    if (err) {
      console.log(err);
      req.flash('image', 'Image failed to upload!')
      res.redirect("/picture")
    } else {
      console.log(obj);
      req.flash('image', 'Image succesfully uploaded!')
      res.redirect("/picture")
    }
  })
  }

})

this last part is a bit messy but i was trying some stuff最后一部分有点乱,但我正在尝试一些东西

i came with a solution if anyone has to do this later如果有人以后必须这样做,我会提供解决方案

router.post("/edit/:id", upload.single("image"), async (req, res, next) => {
  const id = req.params.id;
  const { folder } = sanitize(req.body);
  if(req.file == null){
    console.log("text")
    try{
      const res = await image.findOneAndUpdate({_id:id}, {name: req.body.name,folder: folder})
      console.log(res.name + " " + res.folder + " " + res._id);
  }
  catch(err){
    console.log(err);
  }
  req.flash('imageView', 'ImageText succesfully to upload!');
  res.redirect("/view/" + req.params.id);
  }else{
    console.log("edit picture")
    try{
      const res = await image.findOneAndUpdate({_id:id}, {name: req.body.name,folder: folder, img: {data: fs.readFileSync(
      path.join(__dirname, "../uploads/" + req.file.filename )
    ),
      contentType: "image/png",
    }, })
      console.log(res.name + " " + res.folder + " " + res._id);
  }
  catch(err){
    req.flash('imageView', 'Image and text failed to upload!')
    res.redirect("/view/" + req.params.id)
    console.log(err);
  }
  req.flash('imageView', 'ImageText succesfully upload!');
  res.redirect("/view/" + req.params.id);
  }
})

this is how i did it我就是这样做的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM