我只是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
,因为在异步回调中这实际上没有用。