섹션 3: 사용자 역할 및 데이터 저장소 관리 - MongodB


데이터 저장소
이 시리즈의 세 번째 부분은 사용자 역할과 백엔드의 데이터 저장소를 관리하는 데 중점을 두고 있다.MongoDB은 문서를 저장하기에 적합합니다.최종 목표가 데이터를 전자 표에서 조회 가능한 데이터베이스로 이동하는 것일 때, Mongo는 이 용례의 간단한 선택이다.그것은 또한 GeoQuerying을 지원하는데, 나도 그것이 필요하다는 것을 안다.
저는 또한 Mongoose을 대상 모델링에 사용하고 Joi을 검증 라이브러리로 사용하며 내장된Mongoose 모델 검증에 비해 기존의 검증을 더 많이 제공합니다.

Note: I was looking for a quick and easy way to get this up and running for prototyping purposes. Worth noting is that you could also solely use Mongoose and write your own custom validation methods, which may be better from a dependency management standpoint (or omit Mongoose and use the native MongoDB Driver with a validation library like Joi).



MongodB 연결 문자열
MongoDB 데이터가 저장된 위탁 관리 위치를 정의하기 위해 이 정보는 설정 파일에 저장됩니다. (비록 환경 변수를 통해 응용 프로그램에 전달될 수도 있지만, 그 어떠한 노드 응용 프로그램에서도 마찬가지입니다.)NODE_ENV 변수를 바탕으로 FeatherJS는 상당히 간단한 configuration management을 가지고 있다.프로젝트를 만들 때 default.json 파일은 /config 디렉터리에서 생성됩니다. 이 디렉터리는 일반적인 변수를 미리 불러와서 프로젝트에 따라 조정할 수 있습니다.NODE_ENV 변수를 NODE_ENV=test으로 설정하면 default.jsontest.json이 결합됩니다.Feathers JS 응용 프로그램에서 app.get('key')과 비슷한 물건으로 키에 접근해서 값을 검색하기;
MongoDB 연결을 추가하려면 "mongodb": "mongodb://localhost:27017/api",을 키 값으로 json 프로필에 추가하십시오. 아래와 같습니다.
{
  "host": "localhost",
  "port": 3030,
  // ...
  "mongodb": "mongodb://localhost:27017/api"
}
MongoDB 연결 문자열에 대한 자세한 내용은 MongoDB docs을 참조하십시오.문자열의 정확한 형식은 필요에 따라 다를 수 있습니다.

FeathersJS에 연결
FeatherJS은 소량의 popular database adapters을 지원하는데 메모리 저장, 로컬 저장, 유행하는 관계 데이터베이스(MySQL,Postgresql 등)와 Elasticsearch를 포함한다.
서비스에 대한 데이터베이스 어댑터 설정은 여러 개의 데이터 저장소에 연결하여 데이터를 검색하는 것을 쉽게 한다.CLI 생성기는 또한 다양한 데이터베이스에 대한 새로운 서비스를 쉽게 구축할 수 있습니다.
이 초보자에 대해 사용자 서비스를 정의하여 사용자 정보를 저장했다.이것은 초기 응용 프로그램 생성의 일부분으로 완성할 수 있습니다.그것은 사용자 서비스에 필요한 데이터베이스 어댑터를 포함하여 편리하게 물었다.생성기를 만들고 필요한 파일을 만들어서 시작하십시오.새 서비스를 만들려면 feathers generate service을 사용하십시오.
이 프로그램에서 나는 Mongoose를 사용하기 때문에 /server/src/models/에 모델 파일을 만들었다.이 폴더에서 user.model.js 파일은 데이터가 MongoDB에 어떻게 입력되는지 정의합니다.
const schema = new mongooseClient.Schema(
    {
      email: { type: String, unique: true, lowercase: true },
      password: { type: String },
      firstname: { type: String },
      lastname: { type: String },
      company: { type: String },
      department: { type: String },
      title: { type: String },
      city: { type: String },
      permissions: { type: Array, default: ['guest'] },
      phone: { type: String },
      passwordReset: { type: String },
      passwordResetToken: { type: String },
      lastLoggedIn: { type: Date },
      team: { type: 'ObjectId', ref: 'Teams' },
      googleId: { type: String },
      isVerified: { type: Boolean },
      verifyToken: { type: String },
      verifyShortToken: { type: String },
      verifyLongToken: { type: String },
      verifyExpires: { type: Date },
      verifyChanges: { type: Object },
      resetToken: { type: String },
      resetExpires: { type: Date },
    },
    {
      timestamps: true,
    }
  );
제2부분에서 말한 바와 같이 User Service은 클래스, 갈고리와 서비스 파일로 구성되어 있으며 이 파일들은 User Service (user.service.js)에서 한데 모인다.User Class은 Mongoose 데이터베이스 제공 프로그램을 확장하고 MongoDB에 .create(), .update(), .patch(), .remove() 방법에 대한 접근을 제공하며 사용자의 조작을 촉발할 때 서비스는 이러한 방법을 사용한다.
사용자 클래스
const { Service } = require('feathers-mongoose');
exports.Users = class Users extends Service {};
사용자 서비스
const { Users } = require('./users.class');
const createModel = require('../../models/users.model');

module.exports = function (app) {
  const options = {
    Model: createModel(app),
    paginate: app.get('paginate')
  };

  // Initialize our service with any options it requires
  app.use('/users', new Users(options, app));

  // Get our initialized service so that we can register hooks
  const service = app.service('users');
};

모델 검증
나는 Joi 라이브러리를 사용하여 feather hooks(users.hooks.js)층에서 사용자 모델 검증을 처리했다.받아들일 수 있는 값을 정의한 후에 나는 validate.mongoose(updateSchema, joiOptions) 갈고리를 사용하여 updateSchema을 사용자가 백엔드로 전달할 수 있는 몇 개의 필드의 허용 형식으로 정의했다.조건에 맞지 않으면 요청이 실패하고 오류를 되돌려줍니다.
const firstname = Joi.string()
  .trim()
  .min(2)
  .max(30)
  .pattern(new RegExp('^[a-zA-Z0-9 ]{2,30}$'))

// ... omitted for brevity, view source code 
// for complete validation code

const updateSchema = Joi.object().keys({
  firstname: firstname,
  lastname: lastname,
  city: city,
  company: company,
});
선택한 업데이트 구조는 사용자 역할에 따라 결정됩니다. 관리자가 일반 사용자보다 더 광범위한 권한을 가지고 다른 사용자 필드를 업데이트할 수 있기 때문입니다.

Mongoose vs MongoDB 기본 드라이버
내가 이 프로젝트를 처음 시작했을 때, 나는 원시 몬godb 어댑터를 사용하거나 몬goose와 같은 대상 모델링 라이브러리를 사용하는 장점을 따졌다.아래 링크의 몇 편의 분석을 읽은 후에 나는 마침내 족제비를 계속 사용하기로 결정했다.몬고우스와 몬고DB 어댑터에 대한 다른 사람들의 체험을 듣고 싶습니다.댓글을 남기고 당신의 생각을 공유하세요!
  • Mongoose vs the MongoDB Node Driver
  • Mongoose vs MongoDB Native

  • 마무리
    이로써 이 프로젝트의 현재 상태를 끝냈다.나중에 elasticsearch를 이 백엔드에 통합할 때 업데이트할 수도 있습니다.이 앱에 강력한 검색 기능을 추가할 것을 기대합니다.나는 더 많은 테스트를 추가할 수 있다.아직 없습니다.
    댓글, 질문, 조언을 남겨주세요!니 생각을 알려줘.

    좋은 웹페이지 즐겨찾기