0

So this piece of code is returning description of word in json from https://sjp.pl/ webiste, word which user provied before in request json body

And problem is that i want to send back var 'desc' in res.send but its undefined. How I can access that and send it?

I think thats because item.push($(this).text()) is working only in this axios function and can be accessed only in this scope


const item = [];
var desc;

app.post('/test', (req, res) => {
    const { word } = req.body;

    if(!word) {
        res.status(418).send({error: 'no word provided'})
    }

    console.log(word)

    axios(`https://sjp.pl/${word}`).then(res => {

        const html = res.data
        const $ = cheerio.load(html)

        $('p').each(function() {
            item.push($(this).text())
        })

        desc = item[3]

        console.log(desc) // working until here
    })

    console.log(desc) // undefined here

    res.send({
        description: `${desc}`
    })
})
Cream
  • 33
  • 5
  • The axios request is processed asynchronously. That means that the code execution goes straight to res.send after the axios call is triggered but before it's completed. Simply put your res.send call inside then handler (after desc = items[3]). – Wojtek Majerski May 21 '22 at 20:11
  • I have tried put res.send after this dec = items[3] but I am getting error from Insomnia: "Error: Failure when receiving data from the peer" – Cream May 21 '22 at 20:22
  • Other than that I am getting exception from console: "TypeError: res.send is not a function" – Cream May 21 '22 at 20:23

1 Answers1

1

Use res inside the axios like below. You are getting undefined because the desc scope ends inside that anonymous function. Moreover the axios is async. You may need to use await to make it sync or can follow the idea I proposed below.

const item = [];
var desc;

app.post('/test', (req, res0) => {
    const { word } = req.body;

    if(!word) {
        res0.status(418).send({error: 'no word provided'})
    }

    console.log(word)

    axios(`https://sjp.pl/${word}`).then(res => {

        const html = res.data
        const $ = cheerio.load(html)

        $('p').each(function() {
            item.push($(this).text())
        })

        desc = item[3]

        res0.send({
            description: `${desc}`
        })
    })
})