使用FeatherJS,我定义了一个用户模型,如下所示:
import NeDB from 'nedb';
import path from 'path';
import { Application } from '../declarations';
export default function (app: Application): NeDB {
const dbPath = app.get('nedb');
const Model = new NeDB({
filename: path.join(dbPath, 'users.db'),
autoload: true,
});
Model.ensureIndex({
fieldName: 'email',
unique: true,
});
return Model;
}
由于用户挂钩上的Joi,我确保了一些验证:
import * as feathersAuthentication from '@feathersjs/authentication';
import * as local from '@feathersjs/authentication-local';
import { disallow } from 'feathers-hooks-common';
import Joi from '@hapi/joi';
import { validate } from '../../hooks';
const { authenticate } = feathersAuthentication.hooks;
const { hashPassword, protect } = local.hooks;
const validation = validate(
Joi.object({
email: Joi.string().email().alter({
create: (schema) => schema.required(),
}),
password: Joi.string().min(8).alter({
create: (schema) => schema.required(),
}),
}),
);
export default {
before: {
all: [],
find: [
authenticate('jwt'),
],
get: [
authenticate('jwt'),
],
create: [
validation,
hashPassword('password'),
],
update: disallow(),
patch: [
hashPassword('password'),
authenticate('jwt'),
],
remove: [
authenticate('jwt'),
],
},
// ...
};
Join验证正在工作,如果提交的数据无效,则会产生错误的请求错误。
独特的索引阻止用户使用现有的电子邮件地址创建帐户,但它会产生一个基本的500个错误实例,很难在我的前台应用程序上利用。
有没有一种方法可以用Joi处理唯一验证,或者我应该重新思考我的逻辑?
注意:我在这里使用的是NeDB,但迁移到Mongo也是可能的。
我也遇到了这个问题。我解决这个问题的方法是从挂钩访问该服务,检查是否已经存在具有相同电子邮件的帐户。
在你的钩子里,加一些类似的东西。
const userService = context.app.service(“users”);// get the users service
const result = await userService.find({query: {email: context.data.email }});
if (result.total > 0) { // throw an error because an account already exists.}
这个解决方案对我来说很有效,因为它与任何类型的数据库或包都是解耦的。
我们在这里所做的是使用用户服务的find()
方法询问用户服务是否已经存在具有相同电子邮件的用户。如果服务返回一条记录,即result.total > 0
,则该服务已经有一个具有相同电子邮件的用户。所以,我们抛出一个例外。
您可以在这里了解更多关于查询服务的信息