2017-12-02 151 views
0

我一直在尋找一個真正的例子,但我找不到任何。我完全陌生的節點js。節點js:我得到一個(子)ecec的輸出並設置一個變量被重新調用?

我正在設置一個服務,它使用命令行工具獲取密碼。

命令行「pw get key」返回與密鑰關聯的密碼。 命令行「pw set key password」設置與密鑰關聯的密碼。

的部分代碼,我至今是:

const util = require('util'); 
const exec = util.promisify(require('child_process').exec); 

async function cmdPwGet(key) { 
    const { stdout, stderr } = await exec(`pw get ${key}`); 
    console.log('stdout:', stdout); 
    console.log('stderr:', stderr); 
} 

async function cmdPwPut(key, passwd) { 
    const { stdout, stderr } = await exec(`pw set ${key} ${passwd}`); 
    console.log('stdout:', stdout); 
    console.log('stderr:', stderr); 
} 

class PwService { 

    constructor (KEY){ 
    this.basekey = KEY; 
    this.pwd = ""; 
    } 

    setPw (key, passwd) { 
     key = this.basekey + "." + key; 
     var res = cmdPwPut(key, passwd); 
     /* missing bits */ 
    } 

    getPw (key) { 
     key = this.basekey + "." + key; 
     var res = cmdPwGet(key); 
     /* missing bit */ 
    } 
} 

module.exports = PwService; 

這會testcafe環境內使用。在這裏我定義一個角色。

testRole() { 
    let pwService = new PwService('a-key-'); 
    let pw = pwService.getPw('testPW'); 
    //console.log('pw: '+pw) 

    return Role('https://www.example.com/', async t => { 
    await t 
    .typeText(this.firstInput, 'testPW') 
    .typeText(this.secondInput, pw<??>) 
    .click(this.selectButton); 
    }, { preserveUrl: true }); 
} 

如果我使用文字字符串作爲pw,testcafe代碼將起作用。

/缺失位 /留空,因爲我嘗試了許多不同的事情,但沒有人工作!

我想我可以使它與孩子的* Sync版本一起工作。但是,因爲這是可以並行運行的testcafe,所以我更喜歡異步版本。

有什麼建議嗎?我知道這是真的瞭解node.js中的承諾等,但我無法解決這個問題。

它似乎應該是node.js專家的標準練習。

+0

你表現出很多的代碼,但你不真的不能真正用文字來描述你想要完成什麼或者你現有的東西在哪裏代碼失敗了。因此,我無法確切地告訴您希望我們提供哪些幫助或瞭解問題,並提出自己的代碼來解決問題。 – jfriend00

回答

1

異步/等待只是使異步代碼看起來像同步代碼,你的代碼仍然執行異步。 Async \ Await函數cmdPwGet的返回結果是Promise,而不是您認爲的password

cmdPwGet執行結果是一個承諾

async function cmdPwGet(key) { 
    const { stdout, stderr } = await exec(`pw get ${key}`); 
    return stdout; 
} 

使getPw異步/等待

async getPw(key) { 
     key = this.basekey + "." + key; 
     var res = await cmdPwGet(key); 
     return res; 
    } 

得到密碼

testRole() { 
    let pwService = new PwService('a-key-'); 

    return Role('https://www.example.com/', async t => { 
    // get your password with await 
    let pw = await pwService.getPw('testPW'); 
    await t 
    .typeText(this.firstInput, 'testPW') 
    .typeText(this.secondInput, pw<??>) 
    .click(this.selectButton); 
    }, { preserveUrl: true }); 
} 
+0

謝謝!我認爲等待會在某個時候解決諾言! :( 我的錯。 – mariotti

相關問題