我有一个nodejs路由,我试图使用npm-youtube-dl下载一个url作为mp3。我有一个下载目录,我使用chokidar查看正在添加的文件,当添加文件时,我保存链接到文件,下载完成后,我调用一个应该使用res.download响应下载URL的函数。当调用sendURL函数时,我可以清楚地看到的url已保存之前未定义,当我在console.log时...任何想法我在这里做错了/如何解决这个问题?我猜这是一个js变量范围问题?
我的代码:
var express = require('express');
var router = express.Router();
var yt = require('youtube-dl');
var fs = require('fs');
var path = require('path');
var chokidar = require('chokidar');
var downloadPath = '';
var watcher = chokidar.watch('./downloads', {
ignored: '/^[^.]+$|\.(?!(part)$)([^.]+$)/',
persistent: true
});
watcher.on('add', function(path) {
console.log('added: ', path);
this.downloadPath = path;
console.log('saved', this.downloadPath);
});
/*
router.get('/', function(req, res, next) {
next();
});
*/
router.get('/', function(req, res) {
var url = 'https://soundcloud.com/astral-flowers-music/bella-flor';
var options = ['-x', '--audio-format', 'mp3', '-o', './downloads/%(title)s.%(ext)s'];
var video = yt.exec(url, options, {}, function exec(err, output) {
if (err) { throw err; }
console.log(output.join('\n'));
sendUrl();
});
function sendUrl() {
console.log(this.downloadPath);
//res.download(this.downloadPath);
}
});
module.exports = router;
答案 0 :(得分:2)
你在滥用this
。如果您想在函数中使用downloadPath
变量,请从前面删除this.
。 this.downloadPath
在downloadPath
引用的对象上查找名为this
的属性,它与您的模块全局变量不同。
更多:How does the "this" keyword work?
即便如此,您仍然依赖于在任何客户请求您的add
路由之前调用过的/
回调,并且您将返回分配的 last 值downloadPath
回调至add
。我不知道你在做什么来知道这是否正确,但缺乏协调似乎有问题。