【发布时间】:2018-03-01 19:26:52
【问题描述】:
我的 Promise 函数有一些问题,我的应用程序有这样的结构: - 路线 - 服务 -分贝
db 是一个在应用程序启动时初始化的类,我在其中为 insert/find/ecc 创建了一些包装函数...,service 是路由和 db 之间的一层,我在这里完成了大部分工作。我的问题是,使用下面的代码,如果用户已经存在,我想抛出错误或拒绝承诺,但是当我尝试做这样的事情时,我得到了
无法读取未定义的属性“then”
哪里出错了?
这是我的资源:
router.put('/', (req, res, next) => {
bcrypt.hash(req.body.password, 10)
.then(function (hash) {
req.body.password = hash;
service.addUser(req.body)
.then((user) => {
return res.json(user);
})
.catch((err) => {
return res.json(err);
});
})
.catch((err) => {
return res.json(err);
});
});
这是服务:
getBy(query) {
return this.mongo.find(query);
}
addUser(data) {
if(!data.email) {
return Promise.reject('email_missing');
}
const self = this;
self.getBy({ email: data.email })
.then((user) => {
if(user.length) {
return Promise.reject('user_exist');
}
return self.mongo.insert(data)
})
.catch((err) => {
return Promise.reject(err);
});
}
这是数据库连接:
find(query) {
const self = this;
return new Promise((resolve, reject) => {
self.collection.find(query).toArray((err, res) => {
if (err) {
self.logger.info('Mongo::find error', err);
reject(err);
} else {
self.logger.info('Mongo::find', query);
resolve(res);
}
});
});
}
insert(data) {
const self = this;
return new Promise((resolve, reject) => {
self.collection.insert(data, (err, res) => {
if (err) {
self.logger.info('Mongo::insert error', err);
reject (err)
} else {
self.logger.info('Mongo::insert', res);
resolve(res)
}
});
});
}
非常感谢!
【问题讨论】: