добавить новый объект в массив в файл js в nodeJS - PullRequest
0 голосов
/ 26 мая 2020

Мне просто было интересно, как добавить данные ( pu sh) в массив через конечную точку маршрутизатора express. Предположим, у меня есть массив внутри каталога data/data.js, и мой код маршрутизатора выглядит так:

const express = require('express');
const bodyParser = require('body-parser');
const productRouter = express.Router();
//! bring data
const { products } = require('../data/data');
productRouter.use(bodyParser.json());

productRouter
  .route('/')
  .post((req, res, next) => {
    if (req.body !== null) {
     //some logic
      } else {
        products.push(req.body);
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(products);
      }
    } else {
      //handle error
    }
  });
module.exports = productRouter;

Когда я использую метод POST в конечной точке моего маршрута, он получает sh новые данные и ответ с обновленный массив. Но когда я проверяю свой файл express, это все еще старый массив. Почему я потерял данные?
Сердечно благодарю, если кто-нибудь поможет мне в этом разобраться.


Поскольку @Aditya toke и @Andre Nuechter предложили мне обновить свой код следующим образом:
.post((req, res, next) => {
    if (req.body !== null) {
      if (products.some((product) => product.id === req.body.id)) {
        err = new Error('Product with id:' + req.body.id + ' already exit');
        err.status = 404;
        return next(err);
      } else {
        const data_path = path.join(__dirname, '../data/data.js');
        fs.appendFileSync(data_path, JSON.stringify(req.body));
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(products);
      }
    } else {
      err = new Error('Body didnot contain product information');
      err.status = 404;
      return next(err);
    }
  });

Но он выталкивает новые данные следующим образом:

exports.products = [
  {
    title: 'camera',
    imageUrl: 'https://source.unsplash.com/gGgoDJRD2WM/300x300',
    id: 1,
  },
...
]
exports.orders = [];
{"title":"mens","imageUrl":"https://source.unsplash.com/1-nx1QR5dTE/300x300","id":"6"}

Это не то, что я хочу. Есть ли способ добавить это в массив товаров? Или какой-нибудь лучший подход?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Как вы упомянули о сохранении данных в файле, это возможно только при использовании файловой системы для записи данных в файл,
Я бы рекомендовал использовать файл расширения JSON, так как его легко анализировать и читать .
Вы должны использовать файловую систему для записи данных в файл.
И для дальнейшего добавления его можно использовать как глобальную переменную во всем проекте.
Есть несколько способов поиграть с файловой системой, используя node js.
https://nodejs.org/api/fs.html

Обновлен ответ

@ falamiw Выполните следующие действия.
1. Не используйте данные. js начните использовать данные. json
Структура внутри данных. json будет выглядеть так

{
products : [
  {"title":"mens","imageUrl":"https://source.unsplash.com/1-nx1QR5dTE/300x300","id":"6"},
  {"title":"women","imageUrl":"https://source.unsplash.com/1-nx1QR5dTE/300x300","id":"7"}
          ]
}

Код для внесения изменений в этот JSON файл

 const fs = require('fs');
    let rawdata = fs.readFileSync('data.json');
   let productArray = JSON.parse(rawdata);
  // push changes to your array
   productArray ['product'].push({ any thing you want to add })

После помещения объекта внутрь массива мы внесем изменения в файл data. json с помощью файловой системы.

let data = JSON.stringify(productArray );
fs.writeFileSync('data.json', data);

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

0 голосов
/ 26 мая 2020

Данные потеряны, потому что pu sh не изменяет файл на вашем диске. Для этого вам нужно использовать что-то вроде fs.writeFile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...