Mongoose: RangeError: jsonwebtoken์„ URL์— ์ถ”๊ฐ€ํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋™์•ˆ ์ตœ๋Œ€ ํ˜ธ์ถœ ์Šคํƒ ํฌ๊ธฐ๊ฐ€ ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 03์›” 07์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Automattic/mongoose

๋‚ด ์•ฑ(๋ฉ”์‹ ์ € ์•ฑ์—์„œ ์ƒˆ ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ”์‹œ์ง€(๋ฌธ์ž์—ด) ์ž…๋ ฅ ํ›„ ์ œ์ถœ์„ ํด๋ฆญํ•˜๋ฉด ๋…ธ๋“œ ์„œ๋ฒ„๊ฐ€ ๋‹ซํžˆ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ž…๋ ฅ ์–‘์‹์œผ๋กœ ์ œ์ถœํ•˜๋Š” ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์ง€๋งŒ. ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongodb/lib/utils.js:132
      throw err;
      ^

RangeError: Maximum call stack size exceeded
    at model.Document.$toObject (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/document.js:2058:40)
    at model.Document.toJSON (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/document.js:2401:15)
    at clone (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:164:18)
    at cloneObject (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:246:11)
    at clone (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:172:16)
    at model.Document.$toObject (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/document.js:2109:13)
    at model.Document.toJSON (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/document.js:2401:15)
    at clone (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:164:18)
    at cloneArray (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:260:14)
    at clone (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:159:12)
    at cloneObject (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:246:11)
    at clone (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:172:16)
    at model.Document.$toObject (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/document.js:2109:13)
    at model.Document.toJSON (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/document.js:2401:15)
    at clone (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:164:18)
    at cloneObject (/home/paul/codes/ng2/Seed-MEAN-Feb18-WIP/node_modules/mongoose/lib/utils.js:246:11)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: `node ./bin/www`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/paul/.npm/_logs/2018-03-07T12_32_54_826Z-debug.log

๋‚ด ../models/messages.js์˜ ๋‚ด์šฉ

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var User = require('./user');

var schema = new Schema({
    content: {type: String, required: true},
    user: {type: Schema.Types.ObjectId, ref: 'User'}
});

schema.post('remove', function (message) {
    User.findById(message.user, function (err, user) {
        user.messages.pull(message);
        user.save();
    });
});

module.exports = mongoose.model('Message', schema);

์ด ๋ฌธ์ œ๋Š” post URL์— ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ./message/message.service.ts ํŒŒ์ผ์— jsonwebtoken์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

addMessage(message: Message) {
        const body = JSON.stringify(message);
        const headers = new Headers({'Content-Type': 'application/json'});
        const token = localStorage.getItem('token')
            ? '?token=' + localStorage.getItem('token')
            : '';
        return this.http.post('http://localhost:3000/message' + token, body, {headers: headers})
            .map((response: Response) => {
                const result = response.json();
                const message = new Message(
                    result.obj.content,
                    result.obj.user.firstName,
                    result.obj._id,
                    result.obj.user._id);
                this.messages.push(message);
                return message;
            })
            .catch((error: Response) => Observable.throw(error.json()));
    }

ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ - ์ „์ฒด ์ฝ”๋“œ ๊ธฐ๋ฐ˜

node.js, mongoose ๋ฐ MongoDB ๋ฒ„์ „์„ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.
๋…ธ๋“œ - v9.3.0
mongodb - ๋ฒ„์ „ v3.6.3
๋ชฝ๊ตฌ์Šค - 5.0.9

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @rohan-paul ๋‹˜,

๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณต์ œํ–ˆ์œผ๋ฉฐ ์ž‘๋™ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” 2์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

InspiredMacPro:rohan lineus$ git diff routes/messages.js 
diff --git a/routes/messages.js b/routes/messages.js
index 21996e0..5e3360d 100644
--- a/routes/messages.js
+++ b/routes/messages.js
@@ -45,7 +45,7 @@ router.post('/', function (req, res, next) {
         }
         var message = new Message({
             content: req.body.content,
-            user: user
+            user: user._id
         });
         message.save(function (err, result) {
             if (err) {
@@ -55,7 +55,7 @@ router.post('/', function (req, res, next) {
                 });
             }
             // Now because, I am connecting user with message, I have to save messages array in user model.
-            user.messages.push(result);
+            user.messages.push(result._id);
             user.save();
             res.status(201).json({
                 message: 'Saved message',

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•œ ํ›„* ์ถฉ๋Œ ์—†์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ts์— ๋Œ€ํ•œ ์˜๋ฏธ์žˆ๋Š” ๊ฒฝํ—˜์ด์—†๊ณ  npm install์—์„œ ์ผ๋ถ€ ts ํŒจํ‚ค์ง€์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ts๋ฅผ ํŒŒ์ง€ ์•Š๊ณ  js๋ฅผ ํŽธ์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @rohan-paul ๋‹˜,

๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณต์ œํ–ˆ์œผ๋ฉฐ ์ž‘๋™ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” 2์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

InspiredMacPro:rohan lineus$ git diff routes/messages.js 
diff --git a/routes/messages.js b/routes/messages.js
index 21996e0..5e3360d 100644
--- a/routes/messages.js
+++ b/routes/messages.js
@@ -45,7 +45,7 @@ router.post('/', function (req, res, next) {
         }
         var message = new Message({
             content: req.body.content,
-            user: user
+            user: user._id
         });
         message.save(function (err, result) {
             if (err) {
@@ -55,7 +55,7 @@ router.post('/', function (req, res, next) {
                 });
             }
             // Now because, I am connecting user with message, I have to save messages array in user model.
-            user.messages.push(result);
+            user.messages.push(result._id);
             user.save();
             res.status(201).json({
                 message: 'Saved message',

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•œ ํ›„* ์ถฉ๋Œ ์—†์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ts์— ๋Œ€ํ•œ ์˜๋ฏธ์žˆ๋Š” ๊ฒฝํ—˜์ด์—†๊ณ  npm install์—์„œ ์ผ๋ถ€ ts ํŒจํ‚ค์ง€์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ts๋ฅผ ํŒŒ์ง€ ์•Š๊ณ  js๋ฅผ ํŽธ์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‡ผ dbs
๊ด€๋ฆฌ์ž 0.078GB
๊ตฌ์„ฑ 0.078GB
๋กœ์ปฌ 0.078GB
๋ชฝ๊ตฌ์Šค_ํ…Œ์ŠคํŠธ 0.203GB
๋…ธ๋“œ ๊ฐ 0.078GB
ํ…Œ์ŠคํŠธ 0.078GB
๋…ธ๋“œ ๊ฐ๋„ ์‚ฌ์šฉ
db ๋…ธ๋“œ ๊ฐ๋„๋กœ ์ „ํ™˜
์ปฌ๋ ‰์…˜ ๋ณด์—ฌ์ฃผ๊ธฐ
๋ฉ”์‹œ์ง€
์‹œ์Šคํ…œ.์ธ๋ฑ์Šค
์‚ฌ์šฉ์ž
db.users.find().pretty()
{
"_id": ObjectId("5a9ff3800f2abba5379e8e93"),
"firstName": "ํ”Œ๋ฆฌํ”ผ",
"์„ฑ": "๋งฅ๋‘๊ฐˆ",
"๋น„๋ฐ€๋ฒˆํ˜ธ" : "$2a$10$J5H/BEKxik2SOt1b/vxWgOQIdNEERynejS7n6okj6JHTfhO/DySSG",
"์ด๋ฉ”์ผ" : " [email protected] ",
"๋ฉ”์‹œ์ง€": [
๊ฐœ์ฒด ID("5a9ff4fe079501a615a5f6ff"),
ObjectId("5a9ff5d654a45ba796525206")
],
"__v" : 2
}

์•ˆ๋…•ํ•˜์„ธ์š” @lineus - ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰