猫鼬:findOne的回调不起作用

时间:2016-10-25 23:27:00

标签: node.js mongodb

我做了一个名为sendShortUrl的回调函数,我测试了在函数中打印的东西,但它没有打印任何东西。你能帮助我吗?

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

3 个答案:

答案 0 :(得分: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时(与回调相同的事情),b将有权访问param1, param2, param3, param4。 这被称为词汇范围,这就是javascript的行为方式。

简要定义:

  

词法作用域定义如何在嵌套中解析变量名称   函数:内部函数甚至包含父函数的范围   如果父函数已经返回。

在您的情况下,当您将函数引用传递给findOne时,您的函数可以访问其中定义的变量,传递给它的参数以及直接父函数(控制器)的范围。

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

您只需点击文档即可检查是否找到了文档。

if(!doc){
    console.log("custom error statement");
}