【发布时间】:2018-02-20 08:48:26
【问题描述】:
我有这段代码,有很多返回块,例如 SignUp()
connectors.js
const connectors = {
Auth: {
signUp(args) {
return new Promise((resolve, reject) => {
// Validate the data
if (!args.email) {
return reject({
code: 'email.empty',
message: 'Email is empty.'
});
} else if (!isEmail(args.email)) {
return reject({
code: 'email.invalid',
message: 'You have to provide a valid email.'
});
}
if (!args.password) {
return reject({
code: 'password.empty',
message: 'You have to provide a password.'
});
}
return encryptPassword(args.password, (err, hash) => {
if (err) {
return reject(new Error('The password could not be hashed.'));
}
return User.create(Object.assign(args, { password: hash }))
.then((user) => {
resolve(createToken({ id: user._id, email: user.email }));
})
.catch((err2) => {
if (err2.code === 11000) {
return reject({
code: 'user.exists',
message: 'There is already a user with this email.'
});
}
return reject(err2);
});
});
});
},
};
module.exports = connectors;
然后调用此代码的另一个代码:
const connectors = require('./connectors');
CallsignUp(root, args) {
const errors = [];
return connectors.Auth.signUp(args)
.then(token => ({
token,
errors
}))
.catch((err) => {
if (err.code && err.message) {
errors.push({
key: err.code,
value: err.message
});
return { token: null, errors };
}
throw new Error(err);
});
}
在 ES6 或 ES7 或 ES2017 中如何避免这种情况?
有:
return()
.then()
return()
.then
然后循环返回:
return()
return()
return()
来自 PHP 的这段代码看起来很疯狂,因为 return 函数返回函数,我不清楚,javascript 中的这种类型的块返回代码的名称是什么?调用再次返回更多代码的函数?
更新:
代码不是我的,完整源代码在
https://github.com/jferrettiboke/react-auth-app-example
我想通过例子来理解:
return encryptPassword(args.password, (err, hash) => {
if (err) {
return reject(new Error('The password could not be hashed.'));
}
return User.create(Object.assign(args, { password: hash }))
.then((user) => {
.catch((err2) => {
return reject(err2);
/src/utils/auth.js(这里是加密密码)
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt-nodejs');
const config = require('../config');
exports.encryptPassword = (password, callback) => {
// Generate a salt then run callback
bcrypt.genSalt(10, (err, salt) => {
if (err) { return callback(err); }
// Hash (encrypt) our password using the salt
return bcrypt.hash(password, salt, null, (err2, hash) => {
if (err2) { return callback(err2); }
return callback(null, hash);
});
});
};
有3个返回调用函数和返回值和函数? OOP 从来都不是这样,@dashmud 建议的如何使用 Async/Await,我不想学习回调之类的老东西
【问题讨论】:
-
"return functions that return functions" - 当你说
return reject(...)立即调用reject()函数然后返回任何 its 返回价值是。这在几乎所有现代语言中都很正常,并且与返回函数不同。 -
欢迎来到函数式编程——这是 PHP 最擅长的领域。
-
顺便说一句,我刚刚注意到一些让我有点担心的命名。看来您有一个名为
encryptPassword()的函数实际上是在散列它。加密与散列不同,这不仅仅是语义,这是存储敏感数据的一个巨大的安全问题。确保您的密码实际上是 hashed,这是一个没有密钥的单向函数,而不是加密,这是一个有密钥的双向函数,并将您的函数命名为这样,例如hashPassword(). -
请阅读我的问题中的更新,代码不是我的,我只是尝试理解代码并寻找更新到 es7、回调、关于安全性和其他原因并不重要问题
-
仅供参考,
async/await是 ES2017(今年发布)的一部分,而不是 ES7(ES2016,去年发布)。
标签: javascript node.js express ecmascript-6 ecmascript-2017