2016-10-25 4 views
0

Я сделал функцию обратного вызова sendShortUrl, и я протестировал ее, чтобы напечатать что-то в функции, но ничего не печатал. Можете ли вы, ребята, помочь мне?Mongoose: обратный вызов findOne не работает

app.post('/api/compress', (req, res) => { 
    let longUrl = checkURL(req.body.url); 
    Url.findOne({long_url: longUrl}, sendShortUrl(err, doc, longUrl)); 
}); 


function sendShortUrl(err, doc, longUrl) { 
    if(err) console.error(err); 
    console.log("success"); 
} 

ответ

0

Что вам нужно сделать, это:

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, ваша функция имеет доступ к переменным, определенным внутри него, параметры, передаваемые к нему, а также объем прямой родительской функции (контроллер).

+0

то как я могу передать переменную longUrl? –

+0

Это было раньше? В вашем примере вам это не нужно. В любом случае, Mongoose вызовет функцию, которую вы передадите, с возможными ошибками и найденным документом. Если вам нужна какая-либо переменная из внешней области, вы можете использовать ее внутри функции обратного вызова. –

+0

У меня возникла ошибка, когда я пытаюсь получить доступ к переменной longUrl в функции обратного вызова. В нем указана переменная longUrl. в основном проблема с областью видимости, а внешняя область не передает переменной функцию обратного вызова. –

0

В этом коде вы выполняете функцию, для того чтобы работа обратного вызова работала, вам необходимо передать функцию, предназначенную для обратного вызова на url.findOne().

app.post('/api/compress', (req, res) => 
{ 
    let longUrl = checkURL(req.body.url); 
    Url.findOne({long_url: longUrl}, sendShortUrl())); 
}); 


function sendShortUrl() 
{ 
    return function(err, doc) 
    { 
     if(err) console.error(err); 
     console.log(doc); 
     console.log(longUrl); 
    } 
} 
+0

У меня возникла ошибка, когда я пытаюсь получить доступ к переменной longUrl в функции обратного вызова. В нем указана переменная longUrl. –

+0

Попробуйте это @PhillipYS, это должно решить проблему. – RodrigoSaint

Смежные вопросы