Route 使 heroku-app 崩溃,但在 localhost 上工作

Posted

技术标签:

【中文标题】Route 使 heroku-app 崩溃,但在 localhost 上工作【英文标题】:Route crashes heroku-app but works on localhost 【发布时间】:2019-11-19 09:23:35 【问题描述】:

我有一个在 Heroku 上运行的工作后端。客户端是一个反应应用程序。 在发出特定的路由器请求之前,一切正常。

我读过很多关于应用程序在本地运行但不在 Heroku 上的帖子。不同之处在于我可以让我的应用程序正常启动和运行,直到向服务器发出特定的后请求。

这是路线。 console.logs 用于调试。我首先要检查用户之前没有对那个特定答案投票,然后用户可以投票。

router.post('/:qID/answers/:aID/vote-:dir',function(req, res, next) 
    console.log(req.body, "THIS IS THE REQ.BODY");
    console.log(req.params.aID);
        if(req.params.dir.search(/^(up|down)$/) === -1) 
            var err = new Error("Not found");
            err.status = 404;
            next(err);
         else 
            req.vote = req.params.dir;
            req.userId = req.body.userId;
            next();
        
    ,
    function(req, res, next)
        console.log(req.body, "IS THIS THE SAME VALUE?");
        try
        User.findById(req.userId, (err, user) => 
            if(err)
                console.log(err, "IS THIS AN ERROR?");
                next(err);
            
            if(user.answersVoted.length > 0) 
                for(let i = 0; i < user.answersVoted.length; i++)
                    if (user.answersVoted[i] == req.answer._id)
                        req.answered = true;
                     else 
                        req.answered = false;
                    
                 return next();
             else 
                updateAnswerArrayandVote(req, res);
            
        );
    catch(err)
        console.log(err, "IS THIS AN ERROR TOO?");
        return next(err);
    

, function(req, res, next)
    if(req.answered)
        res.status(422).json(message: "Only vote once!");
     else 
        updateAnswerArrayandVote(req, res);
    
);

这是客户端

handleVote = (id, dir) => 
        if (dir === "up") 
            axios.post(`https://sleepy-falls-59530.herokuapp.com/questions/$this.state.id/answers/$id/vote-up`, 
              userId: this.props.userId
            )
            .then(res => console.log(res))
            .catch(err => 
              console.log(err);
              this.setState(
                show: true
              )
            )
         else 
            axios.post(`https://sleepy-falls-59530.herokuapp.com/questions/$this.state.id/answers/$id/vote-down`, 
              userId: this.props.userId
            ).then(res => console.log(res))
            .catch(err => 
              console.log(err);
              this.setState(
                show: true
              )
            )
        
    

这是来自 heroku 日志的错误消息:

]: throw er; // Unhandled 'error' event
2019-07-09T16:04:09.523006+00:00 app[web.1]: ^
2019-07-09T16:04:09.523009+00:00 app[web.1]:
2019-07-09T16:04:09.523012+00:00 app[web.1]: TypeError: Cannot read property 'length' of undefined
2019-07-09T16:04:09.523015+00:00 app[web.1]: at User.findById (/app/routes.js:329:34)
2019-07-09T16:04:09.523017+00:00 app[web.1]: at /app/node_modules/mongoose/lib/model.js:4645:16
2019-07-09T16:04:09.523019+00:00 app[web.1]: at /app/node_modules/mongoose/lib/query.js:4004:12
2019-07-09T16:04:09.523023+00:00 app[web.1]: at process.nextTick (/app/node_modules/mongoose/lib/query.js:2622:28)
2019-07-09T16:04:09.523025+00:00 app[web.1]: at _combinedTickCallback (internal/process/next_tick.js:132:7)
2019-07-09T16:04:09.523027+00:00 app[web.1]: at process._tickCallback (internal/process/next_tick.js:181:9)
2019-07-09T16:04:09.569320+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2019-07-09T16:04:09.570120+00:00 app[web.1]: npm ERR! errno 1
2019-07-09T16:04:09.573462+00:00 app[web.1]: npm ERR! restAPI@1.0.0 start: `node app.js`
2019-07-09T16:04:09.573822+00:00 app[web.1]: npm ERR! Exit status 1
2019-07-09T16:04:09.574525+00:00 app[web.1]: npm ERR!

似乎 User.findById() 在 heroku 中不起作用,因为用户对象上的 answersVoted-array 是未定义的。为什么这是在本地工作,更重要的是,我该如何解决?我知道我正在发送正确的值,因为 console.logs 显示在日志中(虽然不包括在这篇文章中)。提前致谢!

编辑

所以 heroku 日志给了我这个:

MuPuLM8q9i6A1a3uFvUzD8K2EbsGkaRt.QlHmBlMi3ry5ZK',
2019-07-10T18:52:49.981062+00:00 app[web.1]: __v: 1,
2019-07-10T18:52:49.981064+00:00 app[web.1]: answersVoted:
2019-07-10T18:52:49.981066+00:00 app[web.1]: [ '5d0bed720498750dbcc31b3e',
2019-07-10T18:52:49.981067+00:00 app[web.1]: '5ceac5948761ba2b4c2f7a7e',
2019-07-10T18:52:49.981069+00:00 app[web.1]: '5d0bed720498750dbcc31b3e',
2019-07-10T18:52:49.981072+00:00 app[web.1]: '5d17524e4dfec60016a07609',
2019-07-10T18:52:49.981074+00:00 app[web.1]: '5d0bed720498750dbcc31b3e',
2019-07-10T18:52:49.981076+00:00 app[web.1]: '5d17524e4dfec60016a07609',
2019-07-10T18:52:49.981078+00:00 app[web.1]: '5cf90359990b3233a0fbb1ce',
2019-07-10T18:52:49.981080+00:00 app[web.1]: '5d17524e4dfec60016a07609' ]  'THE USER'
2019-07-10T18:52:49.981088+00:00 app[web.1]: THE USER IS A object
2019-07-10T18:52:49.981159+00:00 app[web.1]: undefined 'THE USERS ANSWERSARRAY'
2019-07-10T18:52:49.983370+00:00 app[web.1]: TypeError: Cannot read property 'length' of undefined

代码如下:

 User.findById(req.userId, async (err, user) => 
            console.log(user, "THE USER");
            console.log("THE USER IS A", typeof user);
            console.log(user.answersVoted, "THE USERS ANSWERSARRAY");

如您所见,我可以使用显示的 answersVoted-array 访问用户对象。

console.log(user)显示用户和所有嵌套对象,包括答案投票数组

console.log(user.answersVoted)未定义。

异步错误或heroku(因为它适用于邮递员)?请帮忙。

【问题讨论】:

您是否尝试在本地重置数据库?也许您的本地数据格式正确,看不到该错误。 即使我在本地尝试,我仍在使用相同的数据库。如果我从邮递员尝试在我的本地主机上的路由它可以工作,但是如果我从邮递员尝试在 heroku 上的路由,我会收到一个 html 响应,上面写着“应用程序错误”和来自 heroku 日志的上述错误消息。这可能是一个cors-problem吗? 所以您的意思是您的数据库是在您的笔记本电脑上运行,还是已经托管在某个地方? 数据库托管在 mlab 上 如果我使用邮递员作为“前端”,然后请求在 localhost 上运行的 express-app,那么该路线工作正确的唯一方法。 【参考方案1】:

如果您以后想使用它,请务必记住将属性实际添加到您的 Mongoose 模型的架构中,比如在快速路由器中...

【讨论】:

以上是关于Route 使 heroku-app 崩溃,但在 localhost 上工作的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 上测试时应用程序崩溃,但在模拟器中没有

使用 NSUserDefaults 保存数组会使应用程序崩溃

QPainter::begin 在调试模式下使程序崩溃

用户控件总是使 Visual Studio 崩溃

在启用 Aero 的 Windows 7 上运行 .NET 2.0 应用程序窗体应用程序会导致菜单交互使应用程序崩溃

错误:Route.get() 需要回调函数,但在 app.js 中获得了 [object Undefined]