为什么我的变量一次更改后没有更改

时间:2019-07-11 10:13:25

标签: node.js express callback request

我正在制作一个简单的Web应用程序,该应用程序使用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 :(得分:0)

我认为问题在于下面的代码行

    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');
            }

        }
    });
});


  

删除选项和在第12行和第26行声明的URL