我只是Node和Express的新手。尝试在我的路线上传递一个函数而不是文本,但似乎不起作用。我只是看那里的文档,他们只提到了req.send()方法的文本。我正在尝试通过这里的功能,但无法正常工作。并且alert()不能像这样的req.send(alert('Hello world'))一样工作,它表示未定义警报或类似内容。

**更新:**我正在尝试使用express和节点https://github.com/przemyslawpluta/node-youtube-dl执行该库

我在这里尝试通过这样的功能

function blaBla() {
    var youtubedl = require('youtube-dl');
    var url = 'http://www.youtube.com/watch?v=WKsjaOqDXgg';
    // Optional arguments passed to youtube-dl.
    var options = ['--username=user', '--password=hunter2'];
    youtubedl.getInfo(url, options, function(err, info) {
      if (err) throw err;

      console.log('id:', info.id);
      console.log('title:', info.title);
      console.log('url:', info.url);
      console.log('thumbnail:', info.thumbnail);
      console.log('description:', info.description);
      console.log('filename:', info._filename);
      console.log('format id:', info.format_id);
});
}

app.get('/', (req, res) => {
  res.send(blaBla());
})


**代替 **

app.get('/', function (req, res) {
  res.send('Hello World!')
})


希望您能理解我的问题。

最佳答案

res.send()需要一个字符串参数。因此,您必须传递一个字符串。

如果您希望浏览器执行某些Javascript,那么您发送的内容取决于来自浏览器的请求类型。

如果是浏览器页面加载请求,则浏览器需要HTML响应,因此您需要发送回HTML页面字符串。如果要将Javascript作为该HTML页面的一部分执行,则可以在页面内嵌入<script>标记,然后在<script>标记内包含Javascript文本,浏览器将在解析页面和脚本时执行该Javascript正在运行。

如果路由是对脚本标记请求的响应,则可以将Javascript文本作为字符串返回,并且需要确保MIME类型适当地指示它是脚本。

如果路由是对Ajax调用的响应,那么这完全取决于Ajax调用的调用者的期望。如果他们希望使用脚本并打算将文本作为Javascript执行,那么您也可以将Javascript文本作为字符串发送。如果他们期望HTML并将其作为HTML进行处理,那么您可能需要在HTML内嵌入<script>标记才能执行Javascript。

在您的示例中:

response.send(blaBla());


如果blaBla()同步返回一个字符串,该字符串按照上述有关调用者期望的注释正确格式化,则该方法将很好地工作。如果您需要进一步的帮助,则需要向我们展示或描述如何在浏览器中启动请求,并向我们展示blaBla()函数的代码,因为问题可能出在blaBla()函数中。

您所遇到的问题有很多问题:


您在问题的文本中显示req.send(alert('Hello world')).send()方法属于res对象,而不属于req对象(第二个参数,而不是第一个参数)。因此,这将是res.send(),而不是req.send()
在同一段代码中,node.js中没有alert()函数,但是您试图立即执行它并使用.send()发送结果。出于多种原因,这将行不通。
只要blaBla()返回与调用者期望的格式正确的字符串,使用blaBla()的第一个代码块就可以正常工作。如果这不起作用,则blaBla()的操作存在问题,因此我们需要查看该代码。
您的第二个代码块有效,因为您将发送一个字符串,调用者可以处理该字符串。




现在更新,您已经显示了blaBla()的代码。

您的blaBla()代码不返回任何内容,并且是异步的,因此无法返回结果。因此,您不能使用结构response.send(blaBla());。没有办法使它起作用。

相反,您将需要执行以下操作:

blaBla(response);


并且,在知道响应字符串后,修改blaBla()以调用response.send(someTextValue)

function blaBla(res) {
    var youtubedl = require('youtube-dl');
    var url = 'http://www.youtube.com/watch?v=WKsjaOqDXgg';
    // Optional arguments passed to youtube-dl.
    var options = ['--username=user', '--password=hunter2'];
    youtubedl.getInfo(url, options, function(err, info) {
        if (err) {
            res.status(500).send("Internal Error");
        } else {
            console.log('id:', info.id);
            console.log('title:', info.title);
            console.log('url:', info.url);
            console.log('thumbnail:', info.thumbnail);
            console.log('description:', info.description);
            console.log('filename:', info._filename);
            console.log('format id:', info.format_id);
            // construct your response here as a string
            res.json(info);
        }
    });
}


还要注意,错误处理不使用throw,因为在异步回调中这实际上没有用。

09-25 18:35
查看更多