我在Node和Express上真的很新。试图在我的路线上传递函数而不是文本,但它似乎无法正常工作。我只是查看了那里的文档,他们只提到了使用req.send()
方法的文本。我试图传递这里的功能,但它不起作用。并且alert()
不能像req.send(alert('Hello world'))
那样工作,它说警报没有定义或类似。
**更新:**我正在尝试使用express和node 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!')
})
我希望你的家伙能理解我的问题。
答案 0 :(得分:0)
res.send()
需要一个字符串参数。所以,你必须传递一个字符串。
如果您希望浏览器执行某些Javascript,那么您发送的内容取决于浏览器发出的请求类型。
如果是浏览器页面加载请求,则浏览器需要HTML响应,您需要返回HTML页面字符串。如果您想在该HTML页面中执行Javascript,那么您可以在页面中嵌入<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
,因为在异步回调中它实际上没用。
答案 1 :(得分:0)
没有人可以帮助我,在找到事情之后我就知道如何做到这一点。在express
中有一些叫做中间件的东西,我们必须用它来完成这件事。那些真正专家或有express
工作经验的人,他们都知道这件事。
使用functions
表示您需要使用中间件。
如下所示我
const express = require('express')
const youtubedl = require('youtube-dl');
const url = 'https://www.youtube.com/watch?v=quQQDGvEP10';
const app = express()
const port = 3000
function blaBla(req, res, next) {
youtubedl.getInfo(url, function(err, info) {
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);
});
next();
}
app.use(blaBla);
app.get('/', (request, response) => {
response.send('Hey Bebs, what is going on here?');
})
app.listen(port, (err) => {
if (err) {
return console.log('something bad happened', err)
}
console.log(`server is listening on ${port}`)
})
请记住,您必须在获取路线时使用app.use(blaBla);
。否则这可能不起作用。