2017-04-19 94 views
0

我有一個簡單的方法,使用rm -rf作爲命令執行的exec方法。Node.js exec()不執行回調

const exec = require('child_process').exec 

const Foo = { 
    emptyDir: params => { 
    exec(`rm -rf ${params.path}`, (err, stdout, stderr) => { 
     console.log('test'); 
    }) 
    } 
} 

Foo.emptyDir({path:'./data/*'}) 

方法工作和文件被刪除,但回調永遠不會被執行。我錯過了什麼?

節點版本:v6.10.2

+0

它的工作原理,我有相同的節點版本 – Ezzat

+0

@MahmoudEzzat它執行'console.log('test')'部分嗎? – Kunok

+0

好吧,我在其他腳本中運行這個腳本,我在下面同步了'process.exit()',它不會執行回調,因爲在執行回調之前'process.exit()'會殺死它。我編輯了一些問題,如果有人在未來尋找解決實際問題的方法時遇到此問題,它會更有幫助。 – Kunok

回答

0

首先,你可能需要使用這些模塊中的一個節點中刪除文件:

現在,這是不可能的console.log('test');未執行,因爲即使您在PATH中沒有rm命令或者它失敗,您甚至不會測試錯誤,因此它將被執行。

有可能的是,如果STDOUT被重定向,或者甚至重新定義了console.log,您可能看不到console.log()輸出。要真正查看回調是否被調用,您可以嘗試向文件寫入一些消息。

+0

謝謝,你是對的。我已經嘗試了這些模塊,問題出在我執行方法的主腳本中,我同步func'process.exit()',這會在執行回調之前終止腳本。 – Kunok

+0

@Kunok不要自己調用'process.exit()'。你剛剛發現了其中一個原因。 – AlexTes

+0

@AlexTes是的,我很少在生產代碼中使用它。然而,我只是在這個腳本中測試了一些東西,並且使用'process.exit()'來防止下面的其他方法執行。但我沒有深入到足以注意到它實際上是錯誤的測試用例。 – Kunok