Проблема при редактировании продуктов в моем проекте Nodejs - PullRequest
0 голосов
/ 21 июня 2019

Эй, я новичок в Nodejs и пытаюсь отредактировать свои продукты в моих nodejs с помощью экспресс-проекта

Поэтому я сталкиваюсь с проблемой, возникающей при обновлении моего продукта, который хранится в моем файле products.json

файл контроллеров

const Product = require('../models/product');
exports.posteditproduct = (req, res, next) => {
    const upprodid = req.body.productid
    const upprodtitle = req.body.title
    const upprodprice = req.body.price
    const upprodimg = req.body.imageurl
    const upproddesc = req.body.description
    const updatedproduct = new Product(upprodid, upprodtitle, upprodimg, upprodprice, upproddesc);
    updatedproduct.save()
    res.redirect('/')
}

Модель продуктов

const fs=require('fs');
const path=require('path');
module.exports=class Product{
constructor(id,title,imageurl,price,description){
    this.id=id
    this.title=title;
    this.imageurl=imageurl
    this.price=price
    this.description=description
}

save(){
  if(this.id){
  console.log(this.id)   //prints the id correctly

  const p=path.join(path.dirname(process.mainModule.filename),
'data','products.json')
  fs.readFile(p,(err,data)=>{
    const datainfile=JSON.parse(data)
    const existproduct=datainfile.findIndex
(prod=>prod.id===this.id)

        const upproduct=[...datainfile]
        console.log('spread=================================')

         console.log(this)
        upproduct[existproduct]=this
        fs.writeFile(p,JSON.stringify(upproduct),err=>{
            console.log(upproduct) //prints all the data that i have in my file and replaces the updated product with the old product, the output is what i expected..
        })

    })


  }
  else 
  this.id=Math.random().toString()
    const p=path.join(path.dirname(process.mainModule.filename),
  'data','products.json')

    fs.readFile(p,(err,data)=>{
        let products
        if(err){
           products=[] 
        }
        if(!err){
            products=JSON.parse(data)
        }
        products.push(this)
        fs.writeFile(p,JSON.stringify(products),err=>{
            // console.log(err)
        })
    })
    }


    }

Вывод до обновления

[
    Product {
        id: '0.3812592138104218',
        title: 'Burger',
        imageurl:
            'https://www.seriouseats.com/recipes/images/2015/07/20150702-sous- vide - hamburger - anova - primary - 1500x1125.jpg',
        price: '7.5',
        description: 'Very tasty, must try !'
    },
    {
        title: 'Pepsi',
        imageurl: 'https://target.scene7.com/is/image/Target/GUEST_26aa6df7-2fdf - 4b4b- 9f3b - d2ea31b5d685 ? wid = 488 & hei=488 & fmt=pjpeg',
        price: '5',
        description: 'Strong !',
        id: '0.9829663341239048'
    }
]

Вывод после обновления (Обновите название продукта Burger)

[
    Product {
        id: '0.3812592138104218',
        title: 'Burger after trying to update',
        imageurl: 'https://www.seriouseats.com/recipes/images/2015/07/20150702-sous-vide-hamburger-anova-primary-1500x1125.jpg',
        price: '7.5',
        description: 'Very tasty, must try !'
    },
    {
        title: 'Pepsi',
        imageurl: 'https://target.scene7.com/is/image/Target/GUEST_26aa6df7-2fdf-4b4b-9f3b-d2ea31b5d685?wid=488&hei=488&fmt=pjpeg',
        price: '5',
        description: 'Strong !',
        id: '0.9829663341239048'
    }
]

Все хорошо ... теперь, как в моем методе сохранения, наконец, я записываю данные в файл, поэтому возникает проблема ... когда я записываю все данные в мой файл, обновленный продуктне заменяет старый продукт, вместо этого он также добавляется в мой файл json, но я хочу заменить более старую запись новой, не добавляя ее по более старой записи

1 Ответ

1 голос
/ 21 июня 2019

Вот почему вы должны indent ваш код. Вы забыли добавить фигурные скобки после else так,

else
   this.id = Math.random().toString()
const p = path.join(path.dirname(process.mainModule.filename), 'data', 'products.json')
...

Это означает, что, даже если продукт существует, выполняется код после блока else без this.id = .... Потому что он не окружен фигурными скобками.

Так сделайте это:

else{
    this.id = Math.random().toString()
    const p = path.join(...)
    fs.readFile(p, (err, data) => { 
        ...
        })
    })
}

Теперь, начиная с Node v0.5.x, могут также потребоваться файлы JSON,

const product = require(path.join(..., 'product.json'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...