我正在制作一个简单的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
答案 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