Разработка API с помощью Oak от Deno: TypeError — request.body не является функцией

Я учусь разрабатывать API с помощью Deno's Oak, выполняя базовые запросы к списку продуктов.

Но у меня есть ошибка, которую я не могу исправить.

TypeError - request.body не является функцией

const addProduct = async(
    { request, response } : { request: any, response: any },
) => {
    const body = await request.body(); // <-- here

    if (!request.hasBody) {
        response.status = 400;
        response.body = {
            success: false,
            msg: "No data",
        };
    }
    else {
        const product: Product = body.value;
        products.push(product);
        response.status = 201;
        response.body = {
            success: true,
            data: product,
        };
    }
};

Имея в своем коде другие запросы, я делюсь с вами только его частью.

export { getProducts, getProduct, addProduct, updateProduct, deleteProduct };

Чтобы вызвать его в маршруте.ts: router.get('/api/v1/products', addProduct) затем server.ts:

const port = 5000;
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
console.info('Server running on port ${port}');
await app.listen({ port });

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

PS: для проверки своих запросов я использую Postman

Я, очевидно, пытался удалить круглые скобки, но в этом случае он не извлекает тело, вставленное в Postman (необработанное), а просто возвращает true. Я пытался следовать найденным параллельным решениям, но не будучи экспертом, я не могу их понять и адаптировать.

Как именно addProduct используется в вашем коде?

raina77ow 30.04.2024 10:32

Кстати, hasBody считается ненадежным.

raina77ow 30.04.2024 11:26
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
2
186
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

можешь пожалуйста попробовать это решение

import { Request, Response } from "https://deno.land/x/oak/mod.ts";

const addProduct = async ({ request, response }: { request: Request, response: Response }) => {
    const body = await request.body();

    if (!request.hasBody) {
        response.status = 400;
        response.body = {
            success: false,
            msg: "No data",
        };
    }
    else {
        const product: Product = body.value;
        products.push(product);
        response.status = 201;
        response.body = {
            success: true,
            data: product,
        };
    }
};

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

jps 02.05.2024 15:35
Ответ принят как подходящий

Я нашел решение! Расширение Deno в VsCode выбирает последнюю версию Oak при импорте, но в последней я думаю, что body() больше не является функцией запроса. Итак, я беру v6.5.0, на данный момент проблем нет.

Возможно, это не решение, но это помогает мне двигаться дальше.

Другие вопросы по теме

Ошибка Webpack 5 после успешной сборки! (Необнаруженная ошибка выполнения Inpage.js)
TypeError при попытке запустить версию Flutter Web для разработчиков
PyCharm предупреждает: «Ожидаемый тип 'int', получено 'float'» для случайного.randint, но код все равно иногда запускается
Необработанная ошибка времени выполнения TypeError: невозможно прочитать свойства null (чтение «по умолчанию») в моем next.js
Ошибка типа: невозможно прочитать свойства неопределенного значения (чтение «карты») в реакции разработки
Использование pysnmp-lextudio next() с генератором getCmd() приводит к TypeError: объект «кортеж» не является итератором
Как проанализировать столбец с помощью pandas, содержащий «-» [TypeError]
Python – почему мой код возвращает TypeError
HASS — обычный метод определения времени восхода и захода солнца перестал работать — как решить?
Angular внезапно перестал работать в dev, prod и local без изменений, успешно компилируется