Node.js顺序mysql查询承诺不会解析
app.js中的路由调用MySQL模型model.js中的函数registeruser。此寄存器调用displayNameTakendisplay_name,如果显示名称可用,它将返回null,否则它将返回json对象 app.post中包含model.registerreq.body的承诺无法解析 如果取了display name,register将把这个json对象传递回调用路由 如果显示名称未被获取,register将注册用户并将另一个json对象返回到调用路由 应用程序从未解析返回的承诺,app113。 或者你对我应该做什么有什么建议吗? 你能看出我做错了什么吗 输出如下:Node.js顺序mysql查询承诺不会解析,mysql,node.js,promise,Mysql,Node.js,Promise,app.js中的路由调用MySQL模型model.js中的函数registeruser。此寄存器调用displayNameTakendisplay_name,如果显示名称可用,它将返回null,否则它将返回json对象 app.post中包含model.registerreq.body的承诺无法解析 如果取了display name,register将把这个json对象传递回调用路由 如果显示名称未被获取,register将注册用户并将另一个json对象返回到调用路由 应用程序从未解析返回的承诺
1. When display name taken
app#113 [ undefined ]
model#73 { code: 12, message: 'e' }
2. Display name not taken, registration successful
app#113 [ undefined ]
model#73 undefined
model#61 110 //<- last insert id
The app never resolves the returned promise, app#113.
Or do you have any suggestions to what I should do instead?
Can you see what I have done wrong?
app.post('/api/register', function (req, res) {
Promise.all([
model.register(req.body)
]).then((r => {
console.log('app#113',r);// r=> undefined
res.status(200).json(r);
})).catch((e => {console.log(e);
res.status(500).json(e);
}));
});
function Model(db){
this.db = db;
}
//Function returns null if display name is not taken
Model.prototype.displayNameTaken = function(display_name){
return new Promise((resolve, reject, next) => {
var sql = "SELECT id FROM `users` WHERE `display_name` = ?";
var rv;
this.db.query(sql, [[display_name]], (err, result) => {
if (err) {
return resolve(err);
}
if(0 < result.length && result[0].id != undefined && result[0].id != NaN && 0 < result[0].id){
rv = {code: 12, message:'e'};
}else{
rv = null;
}
return resolve(rv);
});
});//Promise
}
model.register = function register(params){
if(params == undefined){
return;
}
var rv;
Promise.all([
this.displayNameTaken(params.display_name.trim())
]).then((r => {
return new Promise((resolve, reject, next) => {
if(r[0] == null){//display_name available
var sql = "INSERT INTO `users` (`display_name`, `email`, `hash`, `created`,`md51`, `md52`, `language`) VALUES ?";
var md51 = md5(randomString({length:32}));
var md52 = md5(randomString({length:32}));
var user = [[
params.display_name.trim(),
params.email.trim(),
passwordHash.generate(params.hash.trim()),
datetime.create().format('Y-m-d H:M:S'),
md51,
md52,
params.language
]];
this.db.query(sql, [user], function (err, result) {
if (err) {
return reject(err);
}
console.log('model#61',result.insertId);
if(0 < result.insertId){
rv = {code: 8, message:'i', md51: md51, md52: md52};
}else{
rv = {code: 0, message:'e'};
}
return resolve(rv);
});
}else{//display_name taken
rv = r[0];
}
console.log('model#73',rv);
return resolve(rv);
});//Promise
})).catch((e => {
console.log(e);
}));
我认为你应该在做这件事的注册表函数中做一个“返回承诺。全部…”。谢谢你,克丽丝!我认为你应该在做这件事的注册表函数中做一个“返回承诺。全部…”。谢谢你,克丽丝!