2017-08-21 359 views
0

我有一个nodejs路线,我试图使用npm-youtube-dl将mp3下载为mp3。我有一个下载目录,我用chokidar查看添加的文件以及添加文件时,我保存链接到文件,下载完成后,我调用一个应用res.download下载URL的函数。当调用sendURL函数时,我可以清楚地看到的url之前保存的是未定义的,当我console.log它...任何想法我在这里做错了/我该如何解决这个问题?我猜这是一个JS变量范围问题?nodejs变量范围问题

我的代码:

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; 

回答

2

你滥用this。如果要在功能中使用downloadPath变量,请从其前面移除this.this.downloadPath寻找属性this引用的对象调用downloadPath,该对象与您的模块全局变量不同。

更多:How does the "this" keyword work?


即使有,你就靠你add回调的任何客户端请求您/路线之前已经调用,你回国分配到downloadPath最后值通过add回调。我不知道你在做什么来确定这是否正确,但缺乏协调似乎存在问题。