Ошибка получения: невозможно установить заголовки после их отправки - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь реализовать функцию поиска в Node, mongoose.
Есть два параметра, по которым мне нравится искать: по имени или по исполнителю.Если какое-либо из двух совпадений совпадает с текущей базой данных, оно должно вернуть значение (что делает его успокаивающим)

Однако, оно отправляет ответ Error: Can't set headers after they are sent.
и Unhandled promise rejections are deprecated, и даже ответ, который я получаю,empty

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

Вот мой текущий код

app.get('/search/:textValue', controller.findData)

и findData

exports.findData = (req, res)=>{

    const searchParam = req.params.textValue;
    let storeResult = []
    if(searchParam==null|| searchParam == undefined || searchParam==""){
        return res.status(500).json("Send a valid input")
     }
  else{
        Song.find({artists: new RegExp(searchParam, "i")}).lean().then((data)=>{
            storeResult[0].push(data)
        }).catch((err)=>{
            return res.send(err)
        })

        Song.find({name: new RegExp(searchParam, "i")}).lean().then((data)=>{
            storeResult[1].push(data)
        }).catch((err)=>{
            return res.send(err)
        })

        return res.send(storeResult)
    }
}

Они отлично работают с одиночными запросами, какие изменения следует внести здесь?

Ответы [ 3 ]

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

Как у вас есть, вы используете res.send(storeResult), прежде чем заполнить storeResult.Как так?Вы заполняете его своими .then() обратными вызовами, которые еще не были вызваны.

Попробуйте объединить свои then обратные вызовы.

 Song.find({artists: new RegExp(searchParam, "i")}).lean()
.then((data)=>{
    storeResult.push(data);
})
.then(() => {
    Song.find({name: new RegExp(searchParam, "i")}).lean()
    .then((data)=>{

        storeResult.push(data)
    })
    .then(() => {
        console.log(storeResult)
        res.send(storeResult)
    })  
})
.catch((err)=>{
    console.log("Here is error")
    console.log(err)
    res.send(err)
})
}

Подсказка.Step-into в вашем отладчике полезен для устранения неисправностей такого рода кода.

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

Проблема

  1. Вы начинаете с пустого массива let storeResult = []
  2. Затем вы получаете доступ к его первому элементу (который не существует) storeResult[0].push(data)
  3. Это вызовет ваш catch обратный вызов.А затем выполните res.send(err)
  4. Даже если вы позвонили return, он все равно продолжится в (req, res) => {}.Это связано с тем, что return предназначен только для обратного вызова (err) => { // }
  5. То же самое с storeResult[1].push(data)
  6. Наконец, вы звоните return res.send(storeResult), который эффективно завершает ваш (req, res) => {} обратный вызов и возвращает другойответ клиенту

Решение :

При нажатии на массив storeResult опустите индекс.Вот так

storeResult.push(data)

Примечание

Даже при правильном нажатии может произойти ошибка при доступе к базе данных.Вот почему вам также необходимо связать ваши обратные вызовы, например O.Джонс ответ говорит

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

Попробуйте это:

exports.findData = (req, res)=>{
    let count=0;
    const searchParam = req.params.textValue;
    let storeResult = []
    if(searchParam==null|| searchParam == undefined || searchParam==""){
        return res.status(500).json("Send a valid input")
     }
  else{
        Song.find({artists: new RegExp(searchParam, "i")}).lean().then((data)=>{
            storeResult[0].push(data)
        }).catch((err)=>{
            count++;
            return res.send(err)
        })
        if(count == 0) {
            Song.find({name: new RegExp(searchParam, "i")}).lean().then((data)=>{
                storeResult[1].push(data)
            }).catch((err)=>{
                count++;
                return res.send(err)
            })
        }
        if(count == 0) {
            return res.send(storeResult)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...