Express API发布请求在本地有效,但在Heroku上失败

时间:2020-06-28 21:41:57

标签: node.js mongodb express heroku mongoose

所以我有一个快速的API。发送给它的发布请求在本地可以运行,但是当我将其部署到Heroku时,在我对Postman进行测试时失败了。在这里,我将向您展示从heroku logs和服务器(路由代码)中获得的信息:

## Heroku logs
 
2020-06-28T17:00:26.000169+00:00 app[api]: Release v4 created by user 
2020-06-28T17:00:26.165056+00:00 heroku[web.1]: State changed from crashed to starting
2020-06-28T17:00:27.000000+00:00 app[api]: Build succeeded
2020-06-28T17:00:28.324211+00:00 heroku[web.1]: Starting process with command `npm start`
2020-06-28T17:00:30.918283+00:00 app[web.1]: 
2020-06-28T17:00:30.918309+00:00 app[web.1]: > myapp@1.0.0 start /app
2020-06-28T17:00:30.918310+00:00 app[web.1]: > node server.js
2020-06-28T17:00:30.918310+00:00 app[web.1]: 
2020-06-28T17:00:32.474593+00:00 heroku[web.1]: State changed from starting to up
2020-06-28T17:01:01.738558+00:00 app[web.1]: connect succesfully!
2020-06-28T17:01:31.772725+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-sierra-47869.herokuapp.com request_id=223793a6-f77d-4a2b-83bf-0c73ab117775 fwd="75.71.7.56" dyno=web.1 connect=1ms service=12ms status=404 bytes=383 protocol=https
2020-06-28T17:01:54.442464+00:00 heroku[router]: at=info method=POST path="/" host=peaceful-sierra-47869.herokuapp.com request_id=dea03d53-8229-49fc-88e0-0dc083afa904 fwd="75.71.7.56" dyno=web.1 connect=1ms service=35ms status=404 bytes=384 protocol=https
2020-06-28T17:02:07.616543+00:00 heroku[router]: at=info method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=42fa1047-67da-4d40-a559-165a45ec6668 fwd="75.71.7.56" dyno=web.1 connect=1ms service=14ms status=422 bytes=425 protocol=https
2020-06-28T17:02:19.649813+00:00 heroku[router]: at=info method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=8184a15b-928c-4cb3-8bb2-0793f8942bd3 fwd="75.71.7.56" dyno=web.1 connect=1ms service=5ms status=422 bytes=429 protocol=https
2020-06-28T17:02:51.161097+00:00 heroku[router]: at=info method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=2b65550d-1a68-499c-b65e-52a93727ba1c fwd="75.71.7.56" dyno=web.1 connect=1ms service=7ms status=422 bytes=321 protocol=https
2020-06-28T17:03:02.233071+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=676d4fac-d641-4f6f-ac2c-0623ceb95c31 fwd="75.71.7.56" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https
2020-06-28T17:03:27.842943+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=e23ee5d6-6133-484b-83d1-d9aa8a8d805e fwd="75.71.7.56" dyno=web.1 connect=1ms service=30003ms status=503 bytes=0 protocol=https
2020-06-28T17:38:31.314094+00:00 heroku[web.1]: Idling
2020-06-28T17:38:31.316222+00:00 heroku[web.1]: State changed from up to down
2020-06-28T17:38:32.632834+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2020-06-28T17:38:32.800439+00:00 heroku[web.1]: Process exited with status 143
2020-06-28T18:41:53.590065+00:00 heroku[web.1]: Unidling
2020-06-28T18:41:53.633857+00:00 heroku[web.1]: State changed from down to starting
2020-06-28T18:41:56.534301+00:00 heroku[web.1]: Starting process with command `npm start`
2020-06-28T18:41:59.583503+00:00 app[web.1]: 
2020-06-28T18:41:59.583531+00:00 app[web.1]: > myapp@1.0.0 start /app
2020-06-28T18:41:59.583531+00:00 app[web.1]: > node server.js
2020-06-28T18:41:59.583531+00:00 app[web.1]: 
2020-06-28T18:42:00.831129+00:00 heroku[web.1]: State changed from starting to up
2020-06-28T18:42:15.614809+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-sierra-47869.herokuapp.com request_id=106c03a3-bb7b-4aa0-a5dc-6ff21fbf9dfc fwd="75.71.7.56" dyno=web.1 connect=1ms service=6ms status=404 bytes=383 protocol=https
2020-06-28T18:42:18.614798+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-sierra-47869.herokuapp.com request_id=84b3c61c-a58c-4040-b3fd-af97ec6a28ea fwd="75.71.7.56" dyno=web.1 connect=1ms service=4ms status=404 bytes=383 protocol=https
2020-06-28T18:42:30.472774+00:00 app[web.1]: connect succesfully!
2020-06-28T18:42:31.688047+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=35de2b28-ac52-4247-a52e-87206f35eb37 fwd="75.71.7.56" dyno=web.1 connect=1ms service=30001ms status=503 bytes=0 protocol=https
2020-06-28T18:45:15.640333+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-sierra-47869.herokuapp.com request_id=2ce30c29-d330-4c7a-a24d-82c0016b22fa fwd="75.71.7.56" dyno=web.1 connect=0ms service=4ms status=404 bytes=383 protocol=https
2020-06-28T18:45:58.206548+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=a57c93f5-cf60-4c28-b99f-9e924cbf6270 fwd="75.71.7.56" dyno=web.1 connect=0ms service=30000ms status=503 bytes=0 protocol=https
2020-06-28T18:51:44.193312+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=fec8c8a1-d7c5-4393-8852-e36771cf1dfc fwd="75.71.7.56" dyno=web.1 connect=5ms service=30006ms status=503 bytes=0 protocol=https
2020-06-28T19:20:18.334810+00:00 heroku[web.1]: Idling
2020-06-28T19:20:18.337241+00:00 heroku[web.1]: State changed from up to down
2020-06-28T19:20:19.565141+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2020-06-28T19:20:19.664454+00:00 heroku[web.1]: Process exited with status 143
2020-06-28T21:05:43.391044+00:00 heroku[web.1]: Unidling
2020-06-28T21:05:43.407486+00:00 heroku[web.1]: State changed from down to starting
2020-06-28T21:05:46.540194+00:00 heroku[web.1]: Starting process with command `npm start`
2020-06-28T21:05:49.717362+00:00 app[web.1]: 
2020-06-28T21:05:49.717420+00:00 app[web.1]: > myapp@1.0.0 start /app
2020-06-28T21:05:49.717426+00:00 app[web.1]: > node server.js
2020-06-28T21:05:51.082642+00:00 heroku[web.1]: State changed from starting to up
2020-06-28T21:05:52.504484+00:00 heroku[router]: at=info method=GET path="/users/1" host=peaceful-sierra-47869.herokuapp.com request_id=0f6e0493-a67d-4597-979f-f3c3a3091465 fwd="75.71.7.56" dyno=web.1 connect=1ms service=48ms status=200 bytes=246 protocol=https
2020-06-28T21:06:20.679758+00:00 app[web.1]: connect succesfully!
2020-06-28T21:07:34.667678+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=fb9ceb56-1991-483a-be45-95d339ad3cec fwd="75.71.7.56" dyno=web.1 connect=0ms service=30000ms status=503 bytes=0 protocol=https
2020-06-28T21:08:41.256696+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=9fc27994-88bb-43c8-a9ef-b5e2aa20c6bf fwd="75.71.7.56" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https
2020-06-28T21:16:20.848755+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=b0ac5b4c-9349-488a-8446-31dc01ed00fb fwd="75.71.7.56" dyno=web.1 connect=0ms service=30001ms status=503 bytes=0 protocol=http
2020-06-28T21:16:31.106986+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=b0ac31ae-4cb6-42b5-a99f-cc48564783a1 fwd="75.71.7.56" dyno=web.1 connect=0ms service=30002ms status=503 bytes=0 protocol=https
2020-06-28T21:22:32.020268+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/signup" host=peaceful-sierra-47869.herokuapp.com request_id=206ab63d-718a-43ea-899a-0200f4444106 fwd="75.71.7.56" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https
## server.js
const express = require('express');
const mongoose = require('mongoose');
const app = express();
const PORT = 5000;
const routes = require('./routes');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');

app.use(bodyParser.json());

app.use(async (req, res, next) => {
  if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0]==='JWT') {
    token = req.headers.authorization.split(' ')[1];
    jwt.verify(token, 'secret', (err, decoded) => {
      err? res.json(err.message) : req.user = decoded;
      next();
    } );
  } else {
    req.user = undefined;
    next();
  }
});

app.use('/', routes);

mongoose.connect('mongodb://localhost:27017/my_important_dates', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
}, ()=>{
  console.log('connect succesfully!');
});

app.listen(process.env.PORT || PORT);
## user routes
const express = require('express');
const eventRoutes = require('./event_routes');
// eslint-disable-next-line new-cap
const router = express.Router();
const validateUser = require('../validator');
const {getUser, updateUser, loginRequired, rightUser} = require('../controllers/usersController');

router.use(loginRequired);

router.route('/:id')
    .get(getUser)
    .put(rightUser, validateUser, updateUser);// You have to be the right user to change the user


router.use('/:id/events', eventRoutes);

module.exports = router;

## userController.js
const User = require('../models/user');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');

const signUp = (req, res) => {
  User.init()
      .then( async ()=>{
        const user = new User(req.body);
        user.hashPassword = bcrypt.hashSync(req.body.password, 10);
        const result = await user.save();
        res.json(result);
      })
      .catch((err) => {
        res.json(err);
      });
};

module.exports = {getUser, signUp, updateUser, login, loginRequired, rightUser};

由于我收到错误消息说request timeout,所以我猜测是否与MongoDB数据库挂起有关? 另外,很奇怪的是,当我使用错误的数据进行注册时,确实收到了错误消息,但是当我使用良好的数据进行请求时,响应就挂在那里。

但是顺便说一句,无论谁想恢复问题,这里是链接:https://peaceful-sierra-47869.herokuapp.com/signup,您可以使用以下命令对此进行发布:

"name": "aaa123",
"email": "l123@123.com",
"password": "pas8889"
}

更新:因此,我仅通过将MongoDB连接URL从本地主机更改为MongoDB地图集URL即可“解决”该问题。我不知道为什么以前的MongoDB URL不起作用。所以我没有解决这个问题。如果您知道的话,请留下您的答案,但是要提到的一件事是,如果您使用API​​链接,它现在就可以使用,但仅凭我使用MongoDB Atlas。

谢谢!

1 个答案:

答案 0 :(得分:1)

此格式为mongodb://localhost**的连接URI是指在服务器上本地运行的数据库。 -Source

除非您在Heroku服务器上安装了MongoDB(我相信您没有),否则您将无法连接到在服务器本地运行的MongoDB实例。这解释了为什么预期在发生数据库操作时请求会超时,以及为什么更改连接URI以引用MongoDB Atlas实例的原因,从而解决了该问题。