Угловой ресурс 404 не найден

Я читал другие сообщения с похожими ошибками 404, моя проблема в том, что я могу правильно запросить данные JSON, но не могу сохранить, не получив эту ошибку.

Я использую Angular $resource для взаимодействия с конечной точкой JSON. У меня есть объект ресурса, возвращающийся с фабрики следующим образом:

app.factory('Product', function($resource) {
        return $resource('api/products.json', { id: '@id' });
});

Мой JSON действителен, и я могу успешно использовать метод ресурса query() для возврата объектов внутри моей директивы, например:

var item = Product.query().$promise.then(function(promise) {
  console.log(promise) // successfully returns JSON objects
});

Однако, когда я пытаюсь сохранить элемент, который я обновил, используя метод save(), я получаю ошибку 404 Not Found.

Это ошибка, которую я получаю:

http://localhost:3000/api/products.json/12-34 404 (Not Found)

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

Вот моя структура данных:

[
    {
        "id": "12-34",
        "name": "Greece",
        "path": "/images/athens.png",
        "description": ""
    },
    ...
]

person Himmel    schedule 25.07.2015    source источник
comment
Вы уверены, что запрос POST должен попадать в products.json/12-34?   -  person Tom    schedule 25.07.2015
comment
вы получаете эту ошибку, потому что сервер не может найти этот файл http://localhost:3000/api/products.json/12-34 и не имеет маршрута для этого   -  person Grundy    schedule 25.07.2015
comment
Если я делаю что-то вроде Product.save({ id: myObject.id }), а myObject.id равно 12-34, и если мои данные структурированы, как показано выше, не так ли?   -  person Himmel    schedule 25.07.2015
comment
@Grundy, если я сделаю Product.save({ id: myObject.id }), разве он не вернет объект внутри файла JSON с соответствующим идентификатором? Или он ищет файл с именем 12-34?   -  person Himmel    schedule 25.07.2015
comment
нет, у вас есть простой файл json, который не может обработать ни один запрос, вы должны добавить код сервера для процессов post, put и других запросов   -  person Grundy    schedule 25.07.2015


Ответы (3)


По умолчанию метод $save использует глагол POST, вам нужно будет выяснить, какие HTTP-глаголы принимаются вашим сервером, чтобы выполнить обновление, большинство современных серверов API принимают Запросы PATCH или PUT для обновления данных, а не POST.

Затем настройте свой экземпляр $resource для использования правильного глагола следующим образом:

app.factory('Product', function($resource) {
        return $resource('api/products.json', { id: '@id' }, {'update': { method:'PUT' }});
});

проверьте документы $resource для получения дополнительной информации.


ПРИМЕЧАНИЕ. $resource предназначен для подключения внешнего интерфейса к внутреннему серверу, поддерживающему протокол RESTful, если только вы не используете его для получения данных и сохранения их в файл, а не в базу данных. В противном случае, если вы работаете только с интерфейсным решением, где вам нужно реализовать $resource и на данный момент у вас нет сервера, используйте поддельное решение, существует множество отличных решений, таких как развернуть.

person Salem Ouerdani    schedule 25.07.2015

Вероятно, вы не реализуете метод POST для таких URL-адресов, как /api/products.json/12-34. Метод POST запрашивается у angular для сохранения нового ресурса. Поэтому вам нужно обновить приложение на стороне сервера, чтобы поддерживать его и выполнять фактическое сохранение.

person JuniorCompressor    schedule 25.07.2015
comment
Разве у ресурса angular нет возможности обновлять файлы JSON из внешнего интерфейса, как это делается? - person Himmel; 25.07.2015
comment
@Himmel, angular - это клиентская сторона, он не может напрямую обновлять файл на сервере. - person Grundy; 25.07.2015
comment
Angular отправит запрос серверному приложению на сохранение ресурса. Если серверное приложение не знает, как это сделать, angular получит ошибку. - person JuniorCompressor; 25.07.2015
comment
Итак, добавление серверной части узла с помощью методов POST, PUT будет работать для обновления файла JSON? - person Himmel; 25.07.2015
comment
Да, но вам также нужно сделать фактическое сохранение, если у вас нет для этого основы. - person JuniorCompressor; 25.07.2015
comment
с помощью экспресса, например? - person Himmel; 25.07.2015
comment
Сам по себе Express не сохраняет в базу данных. Проверьте ссылки, такие как cwbuecheler.com/web/tutorials/ 2014/ - person JuniorCompressor; 25.07.2015

app.factory('Product', function($resource) {
    return $resource('api/products.json/:id', { id: '@id' });
});

Попробуйте добавить «/:id» в конце строки URL.

person Ryan Sloan    schedule 15.08.2018