【发布时间】:2018-06-16 04:45:53
【问题描述】:
我刚刚关注了tutorial for authentication on node from scotch.io。 他们使用 mongodb 作为后端,我将其移植到 mysql。这是我第一个连接到数据库的节点应用程序。
我用bluebird到promisifymysqljs/mysql包在config/database.js中
const mysql = require('mysql');
const Promise = require("bluebird");
Promise.promisifyAll(mysql);
Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);
这是我model/user.js的代码:
const mysqlPool = require('../../config/database'),
bcrypt = require('bcrypt-nodejs'),
Promise = require("bluebird");
getDb = function(){
return mysqlPool.getConnectionAsync();
}
let user = {
create(user, done) {
getDb().then((db) => {
return db.queryAsync(`insert into bot_users (name, token, type, external_id) values (?, ?, ?, ?)`,
[user.name, user.token, user.type, user.external_id])
}).then((results, fields) => {
console.log(results, fields)
user.id = results.insertId
return done(null, user)
})
},
有些东西我觉得不太好:
getDb().then((db) => {
return db.queryAsync(...)
}).then(...)
看起来有点复杂。我想要一个变量db,可以直接用作db.queryAsync(...).then(...),但我不知道如何将这样的承诺分配给变量db。
我也想对我的方法提出建议。这是在这里使用 Promise 的好方法还是有更好的方法?
是否有必要在 then 回调中使用 return done(null, user) 以遵守一般节点约定,或者在使用 Promise (bluebird) 时不再需要这样做?
【问题讨论】:
标签: mysql node.js promise node-mysql