我做了一个名为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");
}
答案 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");
}