學習node遇上的難題--個人

張*江發表於2020-12-16

現在呢根據自己的需要開始學node.js,但學了不久就遇到了一個問題,所以記錄下來。

封裝的fs.writeFlie,我隨便命名為ss.js

ss.js

//載入fs
const fs = require('fs')

//非同步

function fswrite(path,con){

         return new Promise(function(resolve,reject){

        //寫入檔案,這裡的flag:a表示內容追加。

      fs.writeFile(path,con,{'flag':'a',encoding:"utf-8"},function(err){

        //判斷是否寫入成功

            if(err){
                reject(err)
                //也可以列印一下
                  console.log('寫入失敗')
            }else{
                  resolve(err)
                   console.log('寫入成功')
                }

            })

})
    

因為node是沒有全域性作用域的,只有模組作用域。(我的理解是,檔案與檔案之間是互不影響的,都是封閉的),所以我們需要將它掛載,讓其他檔案也能夠訪問到,所以在ss.js檔案最後面加上module.exports = fswrite.

//載入fs
const fs = require('fs')

//非同步

function writess(path,con){

         return new Promise(function(resolve,reject){

        //寫入檔案,這裡的flag:a表示內容追加。

      fs.writeFile(path,con,{'flag':'a',encoding:"utf-8"},function(err){

        //判斷是否寫入成功

            if(err){
                reject(err)
                //也可以列印一下
                  console.log('寫入失敗')
            }else{
                  resolve(err)
                   console.log('寫入成功')
                }

            })

})

//加上,fswrite是函式名
module.exports = writess

然後還需要在需要使用該方法的檔案中引入才能使用。(以下程式碼是通過提問事件來操作,正常訓練時不必寫這麼多,我記下來只是對我自己有用,正常訓練時只需要)

//引入
const writess = require('./ss')

writess('檔名','寫入的內容')

這是我要記下的。正常測試是不用這麼多的 

//載入readline

const readline = require('readline')

//引入ss檔案,這樣就能訪問到ss.js檔案裡的東西了。
let writess = require('./ss')

//建立readline介面例項
var r1 = readline.createInterface({
    //process的意思好像是在終端顯示

    input:process.stdin,
    output:process.stdout
})

//非同步,
function ti(title){
    return new Promise(function(res,req){
        //設定r1的提問事件
        r1.question(title,function(data1){
          res(data1)
   
    
})
    })
}

  function runding(){
     let xx =ti("你是誰")  
     
     let content1 =`你真的是?${xx}\n`
    
    writess("node學習.txt",content1)
    r1.close()
}
//呼叫
   runding()
//監聽
r1.on('close',function(){
    process.exit(0)
})

但如果就這樣,執行命令之後,會發現寫入檔案的內容卻是

你真的是?[object Promise]

所以需要使用async/await來進行非同步,程式碼如下

const readline = require('readline')
let writess = require('./ss')
var r1 = readline.createInterface({
    input:process.stdin,
    output:process.stdout
})
function ti(title){
    return new Promise(function(res,req){
        r1.question(title,function(data1){
          res(data1)
   
    
})
    })
}

//這裡變了。
async function runding(){
     let xx = await ti("你是誰")  
     
     let content1 =`你真的是?${xx}\n`
    
    await writess("node學習.txt",content1)
    r1.close()
}
   runding()
r1.on('close',function(){
    process.exit(0)
})

這樣就能正常寫入檔案了了。

相關文章