Что вам нужно сделать, это:
app.post('/api/compress', (req, res) => {
let longUrl = checkURL(req.body.url);
function sendShortUrl(err, doc) {
if(err) console.error(err);
console.log("success");
}
Url.findOne({long_url: longUrl}, sendShortUrl);
});
Тогда sendShortUrl
будет иметь доступ к longUrl
, не передавая его в качестве параметра.
Объяснение:
Допустим, у вас есть функция, так и внутри нее еще одну функцию:
function a(param1, param2) {
var param3 = 12;
// in this scope, you have access to param1, param2, param3
function b(param4) {
// in this scope, you have access to param1, param2, param3, param4
}
funcWithCallback(something, b); // calling funcWithCallback with some parameter and my b function
}
Когда funcWithCallback
выполняет функцию b
, что я прошел в качестве ссылки (то же самое, что делает mongoose с вашим обратным вызовом), b
будет иметь доступ к param1, param2, param3, param4
. Это называется лексическим охватом, и это то, как ведет себя JavaScript.
Краткое определение:
лексические Обзорный определяет, как имена переменных разрешаются в вложенных функциях: внутренние функции содержат объем родительских функций даже если родительская функция возвращается.
В вашем случае, когда вы передаете вашу ссылку на функцию findOne
, ваша функция имеет доступ к переменным, определенным внутри него, параметры, передаваемые к нему, а также объем прямой родительской функции (контроллер).
то как я могу передать переменную longUrl? –
Это было раньше? В вашем примере вам это не нужно. В любом случае, Mongoose вызовет функцию, которую вы передадите, с возможными ошибками и найденным документом. Если вам нужна какая-либо переменная из внешней области, вы можете использовать ее внутри функции обратного вызова. –
У меня возникла ошибка, когда я пытаюсь получить доступ к переменной longUrl в функции обратного вызова. В нем указана переменная longUrl. в основном проблема с областью видимости, а внешняя область не передает переменной функцию обратного вызова. –