2017-06-10 62 views
-1

我只是Node和Express上的新功能。嘗試傳遞一個函數而不是我的路線上的文本,但它似乎不工作。我只是看着那裏的文檔,他們只提到req.send()方法的文字。我試圖通過這裏功能,但它不工作。並且alert()不能像這樣工作req.send(alert('Hello world'))它表示警報沒有被定義或類似。快遞js傳遞函數路由不工作

**更新**我試圖用快遞和節點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

您是否嘗試過將函數作爲字符串傳遞並讓瀏覽器調用eval()接收的字符串? –

+0

等待一個字符串?這是什麼意思,我不明白事情真的很好。所以,如果你只是給我一個很好的例子。 –

+0

警報將不會在您的服務器上定義,它是web-api的一部分。另外,您可能會對運行時函數執行的工作方式感到困惑。在你的發送示例中,你發送函數blaBlah的返回值,而不是函數本身。 – Shadowfool

回答

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);。否則這可能無法正常工作。

+0

@ jfriend00看,我正在尋找這個。但是你做的事情很複雜。 –

0

res.send()需要一個字符串參數。所以,你必須傳遞一個字符串。

如果您希望瀏覽器執行一些Javascript,那麼您發送的內容取決於來自瀏覽器的請求類型。

如果是瀏覽器頁面加載請求,那麼瀏覽器需要一個HTML響應,並且您需要發送一個HTML頁面字符串。如果您希望將Javascript作爲該HTML頁面的一部分執行,那麼您可以在該頁面內嵌入一個<script>標記,然後在該標記中包含Javascript文本,並在瀏覽器分析頁面並運行腳本時執行該Javascript。

如果路由是對腳本標記請求的響應,那麼您可以將Javascript文本作爲字符串返回,並且您需要確保MIME類型正確指示它是腳本。

如果路由是爲了響應Ajax調用,那麼這一切都取決於Ajax調用的調用者期望的內容。如果他們期望一個腳本,並且要將該文本作爲Javascript來執行,那麼您還可以將JavaScript文本作爲字符串發送。如果他們期望HTML並將其作爲HTML進行處理,那麼您可能需要在HTML中嵌入<script>標籤以獲得執行的JavaScript。

在你的例子:

response.send(blaBla()); 

這會工作得很好,如果blaBla()同步返回每什麼呼叫者期待上述意見正確格式化字符串。如果您需要進一步的幫助,那麼您需要向我們展示或描述請求是如何在瀏覽器中啓動的,並向我們展示blaBla()函數的代碼,因爲問題可能在blaBla()函數中。

有許多你所擁有的東西在你的問題的問題:

  1. 你給你的問題的文本req.send(alert('Hello world')).send()方法屬於res對象,而不屬於req對象(第二個參數,而不是第一個參數)。所以,那將是res.send(),而不是req.send()

  2. 在同一段代碼中,node.js中沒有alert()函數,但是您試圖立即執行它併發送結果.send()。這不會出於一系列原因。

  3. 只要blaBla()返回一個匹配調用者期望的正確格式的字符串,您的第一個使用blaBla()的代碼塊就可以正常工作。如果這不起作用,那麼blaBla()正在做什麼,所以我們需要看到該代碼。

  4. 你的第二個代碼塊的工作原理是因爲你發送了一個字符串,這是調用者可以處理的東西。


現在你已經顯示的代碼 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,因爲這真的不是一個異步回調中非常有用。

+0

我正在更新我的答案,你會看看那個請嗎? @ jfriend00 –

+0

這有道理嗎?那我該如何獲得該功能的迴應?我如何控制或輸出信息,以及我們用'someStringResponse'發送了什麼? –

+0

我怎麼才能從我發送的函數中輸出信息blaBal() –