Почему моя переменная не изменяется после однократного изменения - PullRequest
0 голосов
/ 11 июля 2019

Я делаю простое веб-приложение, которое извлекает определение слова с помощью API. В API-ключах определенно нет ничего плохого, потому что приложение частично работает. Однако, как только я ищу слово в первый раз, оно даст результат, однако, со второй попытки и далее определение не изменится (определение соответствует первое слово вместо последнего).

Я думаю, что это как-то связано с областями видимости и константами, но я уже пробовал это (измените var на let или const). Я читал в Интернете о том, что функции обратного вызова являются асинхронными, но я не думаю, что это проблема вообще.

app.get('/definition/:word', (req, res) => {
    if (word !== req.params.word) {
        console.log("If statement");
        word = req.params.word;
        console.log(word);
        word = word.toLowerCase();
    }

    options.path += '/' + language_code + '/' + word + '?fields=definitions' +
    '&strictMatch=true';

    url += options.path;
    console.log(options.path);

    request(url, options, (error, response, body) => {
        if (error) {
            res.redirect('/error');
        } else {
            let statusCode = (response.statusCode);
            console.log(statusCode);
            if (statusCode === 200) {
                let data = JSON.parse(body);
                console.log(definition);
                definition = String(data.results[0].lexicalEntries[0].entries[0].senses[0].definitions);
                console.log(definition);
                res.render('definition', {
                    wordTitle: word,
                    definitions: definition
                });
            } else {
                res.redirect('/error');
            }

        }
    });
});

app.post('/', (req, res) => {

    console.log("Post");


    word = String(req.body.Word);
    word = word.toLowerCase();

    console.log(word);

    res.redirect('/definition/' + word);
});


РЕДАКТИРОВАТЬ 1: полный исходный код index.js: https://github.com/NikodemBieniek/dictionary/blob/myfeature/server/index.js

1 Ответ

0 голосов
/ 11 июля 2019

Я думаю, что проблема в строке кода ниже

    options.path += '/' + language_code + '/' + word + '?fields=definitions' +
    '&strictMatch=true';

Итак, впервые, когда вы делаете вызов API и передаете параметр как 'XYZ' значение в option.path будет

/en-gb/xyz?fields=definition&strictMatch=true

Во второй раз, когда вы делаете вызов API и передаете параметр в виде 'PQR', значение в option.path будет

/en-gb/xyz?fields=definition&strictMatch=true/en-gb/pqr?fields=definition&strictMatch=true

Потому что вы делаете конкатенацию строк.

Возможное исправление может быть


app.get('/definition/:word', (req, res) => {
    if (word !== req.params.word) {
        console.log("If statement");
        word = req.params.word;
        console.log(word);
        word = word.toLowerCase();




    }
   const options = {
    host: 'https://od-api.oxforddictionaries.com',
    port: '443',
    path: '/api/v2/entries',
    method: "GET",
    headers: {
        'app_id': process.env.APP_ID,
        'app_key': process.env.APP_KEY,
    }
};

    options.path += '/' + language_code + '/' + word + '?fields=definitions' +
    '&strictMatch=true';

    let url = `${options.host}${options.path}`;

    request(url, options, (error, response, body) => {
        if (error) {
            res.redirect('/error');
        } else {
            let statusCode = (response.statusCode);
            console.log(statusCode);
            if (statusCode === 200) {
                let data = JSON.parse(body);
                definition = String(data.results[0].lexicalEntries[0].entries[0].senses[0].definitions);
                res.render('definition', {
                    wordTitle: word,
                    definitions: definition
                });
            } else {
                res.redirect('/error');
            }

        }
    });
});


Удалить параметр и URL, объявленные в строке 12 и 26

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