Почему мои запросы POST не обновляют обслуживаемые файлы .json или .js? - PullRequest
0 голосов
/ 25 сентября 2018

Я знаю, что мне здесь не хватает чего-то простого.Полегче со мной.

У меня есть серверная часть graphQL, которая обслуживает следующее:

const arr = [ { id: 1, foo: 'foo' }, { id: 2, foo: 'bar' }]

, затем я делаю запрос мутации graphql через buildSchema ()

type Mutation {
        updateFooValue(id: Int!, foo: String!): MySchema
}

в моем rootResolver я настроил:

var root = {
    getFooQuery: getFooFunc,
    getFoosQuery: getFoosFunction,
    updateFooValue: updateFooFunc,
};

Затем у меня есть updateFooFunc как:

var updateFooFunc = function ({ id, foo }) {
    arr.map(each => {
        if (each.id === id) {
            each.foo = foo;
            return each;
        }
    });
    return arr.filter(each => each.id === id)[0];
}

На самом деле все это прекрасно работает в localhost / graphiqlПользовательский интерфейс, но когда я проверяю массив, он не обновился.

Аналогичная проблема вчера с использованием пост-запроса выборки / REST.Требования localhost / JSON и немедленной выборки были в порядке, но исходный файл .json остался прежним.Очевидно, означает перезапуск сервера = вы теряете все новые учетные записи / новые сообщения чата или что-то еще - поэтому явно не правильный способ сделать это.

Чего мне не хватает?

1 Ответ

0 голосов
/ 25 сентября 2018

Здесь необходимо иметь в виду несколько вещей.

Когда вы запускаете сервер, переменные типа arr сохраняются в памяти только до тех пор, пока сервер работает.Изменения в значениях переменных только изменят то, что находится в памяти - это не обновит то, что находится в вашем реальном коде.Когда вы останавливаете свой сервер, значения переменных высвобождаются из памяти.Если сервер будет запущен снова, эти переменные снова будут иметь любое начальное значение, которое вы им дали.

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

Кроме того, важно также помнить, что массивметоды типа filter и map не изменяют исходное значение массива, к которому они вызваны.

const array = [1, 2, 3, 4]
array.map(item => item * 2)
console.log(array) // still shows [1, 2, 3, 4]
array.filter(item => item > 3)
console.log(array) // still shows [1, 2, 3, 4]

Если вы хотите, чтобы исходное значение изменилось, вам нужно сделать что-то вроде этого:

let array = [1, 2, 3, 4] // use let since our value will not be *constant*
array = array.map(item => item * 2)
console.log(array) // now shows [2, 4, 6, 8]
array.filter(item => item > 3)
console.log(array) // now shows [4, 6, 8]

Вы также можете связать свои методы следующим образом

array = array.map(item => item * 2).filter(item => item > 3)

Собрав все это вместе, если вы хотите, чтобы ваш распознаватель просто читал и записывал из файла, это выглядело бы примерно так:

const fs = require('fs')

const updateFooFunc = ({ id, foo }) => {
  // assuming foo.json exists
  const valueFromFile = JSON.parse(fs.readFileSync('./foo.json'))
  const newValue = valueFromFile.map(each => {
    if (each.id === id) each.foo = foo
    return each
  })
  fs.writeFileSync(JSON.stringify('./foo.json', newValue))
  // "find" is a little better than "filter" for what you're doing
  return newValue.find(each => each.id === id) 
}
...