问题描述
问题的背景,我使用express,node和MysqL2。
基本上,我正在尝试ping数据库以验证连接。通过使用Promise-then-catch语法,我必须将conn
传递到下一个then
,因为.ping()
不返回任何内容,如果没有这种方式,我将无法释放连接写作。
我的问题是这个
const p0 = Promise.resolve(conn)
const p0 = conn
两种方法都可行,有什么理由让我把它包装在promise中?如果我不这样做会不会有任何问题?
const MysqL = require('MysqL2/promise');
const pool = MysqL.createPool({
host: process.env.DB_HOST || 'localhost',port: parseInt(process.env.DB_PORT) || 3306,database: process.env.DB_NAME || 'playstore',user: process.env.DB_USER,password: process.env.DB_PASSWORD,connectionLimit: parseInt(process.env.DB_CONNECTION_LIMIT) || 4,timezone: '+08:00',});
const sql_GET_APP_CATEGORIES = 'select distinct category from apps ';
pool
.getConnection()
.then((conn) => {
console.info('ping-ing DB');
const p0 = Promise.resolve(conn);
const p1 = conn.ping();
return Promise.all([p0,p1]);
})
.then((results) => {
const conn = results[0];
//Release connection
conn.release();
app.listen(PORT,() => console.log(`Running on http://localhost:${PORT}`));
})
.catch((e) => {
console.log(`Cannot start server ${e}`);
});
解决方法
代替此:
pool
.getConnection()
.then((conn) => {
console.info('ping-ing DB');
const p0 = Promise.resolve(conn);
const p1 = conn.ping();
return Promise.all([p0,p1]);
})
您可以这样写:
pool
.getConnection()
.then((conn) => {
console.info('ping-ing DB');
return conn.ping().then(() => conn);
})
基本上是说conn.ping()
解析时,您要使返回的Promise的解析值为conn
。或者,如果拒绝,则返回的诺言也将被拒绝。
按照您的方式做,没有理由将其包装在承诺中。如果需要,您可以将值传递给Promise.all()
:
return Promise.all([conn.ping(),conn]);
但是,由于您对conn.ping()
中的解析值不感兴趣,并且您只有一个承诺,因此我在此答案开头的建议会更简洁(因此,没有真正的理由使用{{1} },并且只有一个承诺。