2017-09-28 125 views
3

我試圖promisify一個mysql函數,但是當我運行它時控制檯顯示這個錯誤util.Promisify is not a function。這是我的代碼:NodeJs util.promisify不是函數

var util= \t \t \t require('util'); 
 
var mysql=   require('mysql'); 
 

 
var conection=mysql.createConnection({   
 
\t \t \t \t host:'localhost',     
 
\t \t \t \t user:'root',       
 
\t \t \t \t password:'616897',    
 
\t \t \t \t database:'proyect'      
 
\t }); 
 
    
 
    var query = util.promisify(conection.query); 
 
    
 
    query(data.valida_user).then((rows)=>{ 
 
\t console.log(rows); 
 
}).catch((error)=>{ 
 
\t console.log(error); 
 
})

同樣的錯誤,如果 var query = util.promisify(mysql.query);

I'm新節目,但我正在努力學習。

+0

並用'npm install util'添加函數......但是我有版本v6.11.2 –

+0

你也可以使用['mysql2'](https://github.com/sidorares/node-mysql2),速度更快,與'mysql'具有相同的API,並且支持開箱即用的承諾。 – robertklep

回答

2

除非你使用Node.js的8.x中此功能不會被定義,這是when it was added的核心公用事業庫。

由於util is a core Node.js library,你不應該安裝它。如果您使用的是Node.js 6.x,則使用類似Bluebird的庫,該庫具有promisify函數。

+0

如何安裝當前版本8.6?我正在下載它 –

+0

這也解決了問題,再加上你會使用所有新功能,其中有一堆。 – tadman

+0

好的,我有一個新的問題......用這行'var query = util.promisify(conection.query);'...當我運行它的結果是'不能讀取屬性'typeCast'的undefined'你能幫助我嗎? –

7

util.promisify是Node 8.X版本的一部分。但是,您仍然可以爲較舊版本的節點使用polyfill。

一個填充工具可以帶你會在運行應用程序服務器 的舊版本節點的照顧。它可以通過 NPM被安裝在以下方式:

npm install util.promisify 

現在你可以在舊版本的節點

const util = require('util'); 
require('util.promisify').shim(); 

const fs = require('fs'); 
const readFileAsync = util.promisify(fs.readFile); 

http://grizzlybit.info/2017/09/29/Node-JS-8-Util-Promisify/

1

下面的例子應引用修補模塊UTL爲你服務:

async() => { 
 
    const connection = await (util.promisify(pool.getConnection).bind(pool))(); 
 

 
    const fn2 = util.promisify(connection.query).bind(connection); 
 
    const rows = await fn2('SELECT col1, col2 FROM Users WHERE email = ?', [email]); 
 

 
    connection.release(); 
 

 
    return rows; 
 
}

本示例對Node.js使用標準MySQL模塊。 util.promisify是Node.js的內置實用程序。節點8被使用。

該代碼被封裝到一個異步函數中。在第一行中,回調函數'pool.getConnection'被轉換爲承諾,並立即用額外的'await'語句調用。這創建了一系列異步函數,並返回值(連接)而不是函數或承諾。下一行對'conection.query'也是一樣,但爲了簡單起見,將代碼分成兩個語句。最後,函數像任何同步函數一樣返回查詢結果。

+0

正確綁定新功能對我來說是失蹤的關鍵。謝謝! – morgler

0

這裏是promisify的實現:

var promisify = function(fn) { 
 
    return function(){ 
 
    var args = [].slice.apply(arguments); 
 
    return new Promise(
 
     function(resolve,reject){ 
 
     fn.apply(
 
      null, 
 
      args.concat([ 
 
      function(){ 
 
       var results = [].slice.apply(arguments); 
 
       (results[0])//first argument of callback is error 
 
       ? reject(results[0])//reject with error 
 
       : resolve(results.slice(1,results.length))//resolve with result(s) 
 
      } 
 
      ]) 
 
     ) 
 
     } 
 
    ); 
 
    } 
 
}; 
 

 
//some object that has async functions using callbacks 
 
// and using 'this' as invoking object 
 
var callbackApi = { 
 
    name:"callback api", 
 
    age:22, 
 
    asyncFunction:function(arg1,arg2,callback){ 
 
    setTimeout(
 
     function(){callback(null,arg1,arg2,this.name,this.age);}.bind(this), 
 
     10 
 
    ) 
 
    } 
 
} 
 

 
//my object that will use the api functions with promisify 
 
// and using 'this' as invoking object 
 
var myObject = { 
 
    connection:"connection", 
 
    doSomething:function(arg){ 
 
    var asyncFnAsPromise = 
 
     //make sure to bind asyncFunction to callbackApi 
 
     promisify(callbackApi.asyncFunction.bind(callbackApi)); 
 
    //return promise created with result promisified callback api 
 
    return asyncFnAsPromise(this.connection,arg) 
 
    } 
 
} 
 

 
myObject.doSomething(44) 
 
.then(
 
    resolve=>console.log("resolve:",resolve) 
 
);

0

如果你有一個webpack/babel設置,您可以使用babel-plugin-transform-util-promisify。它允許您在節點版本<中使用util.promisify 8。如果您將節點版本定向到大於等於8,但又希望保留低版本的向後兼容性,這也非常有用。

插件轉換寫在以下兩種格式的代碼:

const { promisify } = require('util'); 

import { promisify } from 'util'; 

您將需要安裝插件在.babelrc

{ 
    "plugins": [ 
    "transform-util-promisify" 
    ], 
    "presets": [ 
     ["env", { 
     "targets": { 
      "node": "current" 
     } 
     }] 
    ] 
} 

插件將importrequire轉換爲a function declaration節點版本< 8.它會自動檢測版本> = 8,並在這些情況下使用本地util.promisify