我正在使用node.js和Typescript为后端编程。
我还为打字稿安装了“ mysql”模块和“ @ types / mysql”模块。
如您所知,mysql module基本上不支持诺言模式。
当我使用javascript而不是打字稿时,此代码运行良好。
const pool = mysql.createPool(config);
pool.query = util.promisify(pool.query);
export default pool;
但是,在打字稿中
pool.query
和util.promisify()
的类型不匹配。所以我想在
interface Pool extends EscapeFunctions
的node_modules/@types/mysql/index.d.ts
上添加一个新属性我应该直接编辑
node_modules/@types/mysql/index.d.ts
文件吗?或者,有什么安全的方法吗?
最佳答案
据我所知,默认情况下utils.promisify
仅支持node.js样式的回调,看起来像(err, result) => void
。您的池查询回调被声明为(err, result, fields) => void
之类的东西。简短的回答是,不,默认情况下,您无法使用它。
但是,如果您对此有所了解,则可以扩展utils.promisify
声明以适合您的模块声明,可以在项目中编写如下内容:
declare module "util" {
function promisify<T1, TResult, TFields>(fn: (arg1: T1, callback: (err: any, result: TResult, fields: TFields) => void) => void): () => Promise<{ result: TResult, fields: TFields }>;
}
重新声明promisify之后,您现在需要扩展
pool.query
以支持其他args(如node.js documentation中所述),如下所示:pool.query[util.promisify.custom] = <TResult, TFields>(query: string) => new Promise<{ result: TResult, fields: TFields }>((resolve, reject) => {
pool.query(query, (err, result: TResult, fields: TFields) => {
if (err) { reject(err) }
else { resolve({ result, fields }) }
})
});
现在,您的promisify支持该模块,但它不是那么简单,就像手动声明promise甚至创建自己的promisify函数一样,它将支持任意数量的参数。