Node Express js Ошибка необработанного отклонения [ERR_HTTP_HEADERS_SENT] - PullRequest
0 голосов
/ 09 февраля 2019

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

var express = require("express");
var router = express.Router();
var models = require("../models");

const { check, validationResult } = require('express-validator/check');

/* GET users listing. */
router.get('/', function(req, res, next) {
    res.send('respond with a resource - merchant');
});

/* POST ADD USERS. */
router.post('/add-merchant', [
    check('name').not().isEmpty(),
], (req, res, next) => {
    try {
        const errors = validationResult(req);

        if (!errors.isEmpty()) {
            return res.json({ errors: errors.array()});
        }

        console.log("error passed")

        models.merchants.findOne({ where: {name: req.body.name}}).then((merchant) => {
            if(merchant) {
               throw new Error("Username already exists")
            }
            models.merchants.create(req.body).then((merchant) => {
                res.json(merchant)
            });
        })
    } catch (error) {
        res.json({"status": "error", "message": error.message})
    }
});

module.exports = router;

Я получаю сообщение об ошибке при выполнении кода выше

Unhandled rejection Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (/home/assistanz/Desktop/node/gb360/node_modules/express/lib/response.js:767:10)
    at ServerResponse.send (/home/assistanz/Desktop/node/gb360/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/home/assistanz/Desktop/node/gb360/node_modules/express/lib/response.js:267:15)
    at models.merchants.create.then (/home/assistanz/Desktop/node/gb360/routes/merchant.js:33:21)
    at tryCatcher (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/promise.js:694:18)
    at _drainQueueStep (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/assistanz/Desktop/node/gb360/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:705:18)
    at tryOnImmediate (timers.js:676:5)
    at processImmediate (timers.js:658:5)

Пожалуйста, помогите кому-нибудь решить эту проблему.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

HTTP использует цикл, который требует один ответ на запрос.Когда клиент отправляет запрос, сервер должен отправить клиенту только один ответ.Поэтому измените код, как показано ниже,

models.merchants.findOne({ where: { name: req.body.name } }).then((merchant) => {
    if (merchant) {
        throw new Error("Username already exists")
    } else {
        models.merchants.create(req.body).then((merchant) => {
            res.json(merchant)
        });
    }
})
0 голосов
/ 09 февраля 2019

эта ошибка возникает из-за того, что вы возвращаете ответ и что-то остается для загрузки, вы должны удалить console.log("error passed") или вы можете поместить его перед оператором возврата .. и записать return оператор для каждого оператора res.json как

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