Guest User

Untitled

a guest
Feb 6th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): BulkWriteError: E11000 duplicate key error index: treemaker.families.$members.parents.id_1 dup key: { : null }
  2.  
  3. router.post('/', jwtAuth, jsonParser, (req, res) => {
  4.  
  5. // checking that given id is valid
  6. let { family_name, password, username, id } = req.body;
  7.  
  8. User.findOne({ _id: id})
  9. .count()
  10. .then(count => {
  11. if (count < 1) {
  12. return Promise.reject({
  13. code: 422,
  14. reason: 'Validation Error',
  15. message: 'Family must be created by a user',
  16. location: 'id'
  17. })
  18. }
  19. return Promise.resolve();
  20. })
  21. .catch(err => {
  22. return res.sendStatus(422).json({code: err.code, message: err.message, reason: err.reason, location: err.location })
  23. });
  24.  
  25. // checking that required fields are present
  26.  
  27. const requiredFields = ['family_name', 'username', 'password'];
  28. const missingField = requiredFields.find(field => !(field in req.body));
  29.  
  30. if(missingField) {
  31. return res.status(422).json({
  32. code: 422,
  33. reason: 'Validation Error',
  34. message: 'Missing field',
  35. location: missingField
  36. });
  37. }
  38.  
  39. // checking the format of string fields
  40.  
  41. const stringFields = ['family_name', 'password', 'username'];
  42. const nonStringField = stringFields.find(
  43. field => field in req.body && typeof req.body[field] !== 'string'
  44. );
  45.  
  46. if (nonStringField) {
  47. return res.status(422).json({
  48. code: 422,
  49. reason: 'Validation Error',
  50. message: 'Incorrect field type: expected string',
  51. location: nonStringField
  52. });
  53. }
  54.  
  55. // checking the trimming on fields
  56.  
  57. const trimmedFields = ['family_name', 'password', 'username'];
  58. const nonTrimmedField = trimmedFields.find(
  59. field => req.body[field].trim() !== req.body[field]
  60. );
  61.  
  62. if (nonTrimmedField) {
  63. return res.status(422).json({
  64. code: 422,
  65. reason: 'Validation Error',
  66. message: 'Cannot start or end with whitespace',
  67. location: nonTrimmedField
  68. });
  69. }
  70.  
  71. // checking the length of fields
  72.  
  73. const sizedFields = {
  74. family_name: { min: 1 },
  75. password: { min: 10, max: 72 },
  76. username: { min: 10, max: 72 }
  77. };
  78.  
  79. const tooSmallField = Object.keys(sizedFields).find(field =>
  80. 'min' in sizedFields[field] &&
  81. req.body[field].trim().length < sizedFields[field].min
  82. )
  83.  
  84. const tooLargeField = Object.keys(sizedFields).find(field =>
  85. 'max' in sizedFields[field] &&
  86. req.body[field].trim().length < sizedFields[field].min
  87. )
  88.  
  89. if ( tooSmallField || tooLargeField) {
  90. return res.status(422).json({
  91. code: 422,
  92. reason: 'Validation Error',
  93. message: tooSmallField
  94. ? `Must be at least ${sizedFields[tooSmallField].min} characters long`
  95. : `Must be at most ${sizedFields[tooLargeField].max} characters long`,
  96. location: tooSmallField || tooLargeField
  97. })
  98. }
  99.  
  100. // checking existance of family with same username
  101.  
  102.  
  103. return Family.find({ username })
  104. .count()
  105. .then(count => {
  106. if(count > 0) {
  107. return Promise.reject({
  108. code: 422,
  109. reason: 'Validation Error',
  110. message: 'Username already taken',
  111. location: 'username'
  112. });
  113. }
  114.  
  115. // creating family
  116.  
  117. return Family.hashPassword(password);
  118. })
  119. .then(hash => {
  120.  
  121. // HERE IS THE ISSUE
  122.  
  123. return Family.create({
  124. username,
  125. family_name,
  126. password: hash,
  127. members: []
  128. })
  129. })
  130. .then(family => {
  131. return res.status(201).json(family.apiRepr());
  132. })
  133. .catch(err => {
  134. console.error(err);
  135. return res.status(err.code).json({code: err.code, message: err.message, reason: err.reason, location: err.location })
  136. });
  137. });
Add Comment
Please, Sign In to add comment