Nodejs CRUD + Тест с использованием Почтальона - PullRequest
0 голосов
/ 02 ноября 2019

PRODUCT CREATE - Test 2 with console.log Создание продукта - тест Мне удалось создать категорию, однако при создании продукта я протестировал ее с помощью почтальона и получил ошибку: "", затем ядобавлен код, который требует наличия всех полей. Все они были, кроме сообщения, которое выскакивает сообщение об ошибке: «Все поля обязательны для заполнения». Я перепробовал все приведенные ниже решения, и ни одно из них не помогло мне, идеи?

const formidable = require("formidable");
const _ = require("lodash");
const fs = require("fs");
const Product = require("../models/product");
const { errorHandler } = require("../helpers/dbErrorHandler");

exports.productById = (req, res, next, id) => {
    Product.findById(id).exec((error, product) => {
        if (error || !product) {
            return res.status(400).json({
                error: "Product not found"
            });
        }
        req.product = product;
        next();
    });
};

exports.read = (req, res) => {
    req.product.photo = undefined;
    return res.json(req.product);
};

exports.create = (req, res) => {
    let form = new formidable.IncomingForm();
    form.keepExtensions = true;
    form.parse(req, (error, fields, files) => {
        if (error) {
            return res.status(400).json({
                error: "Image could not be uploaded"
            });
        }
        // check for all fields
        const {
            name,
            description,
            price,
            category,
            quantity,
            shipping
        } = fields;

        if (
            !name ||
            !description ||
            !price ||
            !category ||
            !quantity ||
            !shipping
        ) {
            return res.status(400).json({
                error: "All fields are required"
            });
        }

        let product = new Product(fields);

        // 1kb = 1000
        // 1mb = 1000000

        if (files.photo) {
            // console.log("FILES PHOTO: ", files.photo);
            if (files.photo.size > 1000000) {
                return res.status(400).json({
                    error: "Image should be less than 1mb in size"
                });
            }
            product.photo.data = fs.readFileSync(files.photo.path);
            product.photo.contentType = files.photo.type;
        }

        product.save((error, result) => {
            if (error) {
                return res.status(400).json({
                    error: errorHandler(error)
                });
            }
            res.json(result);
        });
    });
};

exports.remove = (req, res) => {
    let product = req.product;
    product.remove((error, deletedProduct) => {
      if (error) {
          return res.status(400).json({
              error: errorHandler(error)
          });
      }
      res.json({
          "message": "Product deleted successfully"
      });
    });
};

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019
 if (
            !name ||
            !description ||
            !price ||
            !category ||
            !quantity ||
            !shipping
        ) {
            return res.status(400).json({
                error: "All fields are required"
            });
        }

вы отправляете фальшивую почту от почтальона, очевидно, он вернет статус 400, сделайте так:

 if (
            !name ||
            !description ||
            !price ||
            !category ||
            !quantity ||
           shipping!== true || shipping !==false //something like that(or use something from formidable)
        ) {
            return res.status(400).json({
                error: "All fields are required"
            });
        }
    ```


0 голосов
/ 02 ноября 2019

Ваша проблема в настройке типа контента в почтальоне. Вы отправляете данные формы на сервер, но ваш сервер не расшифровал их. по умолчанию ваш сервер получает код x-www-form-urlencoded, и если вы установите почтальон на код x-www-form-urlencoded, ваша проблема исчезнет. Вы должны использовать данные формы для загрузки файла

0 голосов
/ 02 ноября 2019

почему бы не войти в консоль при каждом запросе, например,

exports.productById = (req, res, next, id) => {
    console.log(req.body);
};

exports.read = (req, res) => {
    console.log(req.body);
};

exports.create = (req, res) => {
    console.log(req.body);
};

exports.remove = (req, res) => {
    console.log(req.body);
};

, вы получите четкое представление о том, действительно ли ваш запрос получен вашим бэкэндом.

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