【问题标题】:POST method not working in Heroku with MongoDB / Node.jsPOST 方法在 Heroku 中无法使用 MongoDB / Node.js
【发布时间】:2019-07-13 03:53:32
【问题描述】:

我正在部署一个与我的本地主机一起工作的小应用程序,但现在在 Heroku 上,我遇到了 GET 和 POST 方法的一些问题。 我已经尝试调查了几个小时,但还没有找到正确的答案。

// 我的 index.js 文件

const express = require('express'),
  app = express(),
  path = require('path'),
  bodyParser = require('body-parser'),
  morgan = require('morgan'),
  mongoose = require('mongoose');

let db = mongoose.connection,
port = 4000;

let server = app.listen(port, _server());

mongoose.connect(process.env.MONGOLAB_URI, { useNewUrlParser: true });

db.on('error', console.error.bind(console, 'Error de conexión: '));

db.once('open', function () {
  console.log('Base de datos conectada correctamente');
});

app.use(express.static(path.join(__dirname, 'public')));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(morgan('dev'));

app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, X-Response-Time, X-PINGOTHER, X-CSRF-Token,Authorization');
  res.setHeader('Access-Control-Allow-Credentials', true);
  next();
});

const tareas = require('./componentes/tareas/tareas.route');

app.use('/api', tareas);

module.exports = app;

function _server() {
  console.log('Back-end corriendo en el puerto ' + port);
};

// 我的 tareas.route.js

'use strict';
const express = require('express');
const router = express.Router();
const tareas_api = require('./tareas.api');


router.param('tarea_id', function (req, res, next, tarea_id) {
    req.body.tarea_id = tarea_id;
    next();
});

router.route('/registrar_tarea')
    .post(
        function (req, res) {
            tareas_api.registrar_tarea(req, res);
        }
    );

router.route('/listar_tareas')
    .get(
        function (req, res) {
            tareas_api.listar_tareas(req, res);
        }
    )

router.route('/eliminar_tarea')
    .post(
        function (req, res) {
            tareas_api.eliminar_tarea(req, res);
        }
    )

router.route('/buscar_tarea/:tarea_id')
    .get(
        function (req, res) {
            tareas_api.buscartarea_tareaid(req, res);
        }
    )


router.route('/actualizar_tarea')
    .post(
        function (req, res) {
            tareas_api.actualizar_tarea(req, res);
        }
    );

router.route('/cambiar_estado')
    .post(
        function (req, res) {
            tareas_api.cambiar_estado(req, res);
        }
    );

module.exports = router;

//我的前端服务

let registrar_tarea = (pFecha, pNombre, pDescripcion, pPrioridad, pEncargado) => {
  let request = $.ajax({
    url: '/api/registrar_tarea',
    method: 'POST',
    data: {
      fecha: pFecha,
      nombre: pNombre,
      descripcion: pDescripcion,
      prioridad: pPrioridad,
      encargado: pEncargado,
      estado: "habilitado"
    },
    dataType: "json",
    async: false,
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
  });

  request.done(function (msg) {
    swal.fire({
        type: 'success',
        title: 'La tarea fue registrada',
        text: `Gracias por registrar la tarea. Nombre: ${pNombre}`
    }).then(function () {
        window.location = "/public/listar_tareas.html";
    });
  });

  request.fail(function (jqXHR, textStatus) {
    swal.fire({
      type: 'error',
      title: 'La tarea no pudo ser registrada',
      text: 'Ocurrió un error inesperado, por favor intente de nuevo'
    });
  });
};

let listar_tareas = () => {

  let lista_tareas = [];

  let request = $.ajax({
    url: '/api/listar_tareas',
    method: 'GET',
    data: {
    },
    dataType: "json",
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
    async : false
  });

  request.done(function (res) {
   lista_tareas = res.tareas;
  });

  request.fail(function (jqXHR, textStatus) {

  });
  return lista_tareas;

};

这是结果:无法 POST /api/registrar_tarea

【问题讨论】:

  • 你定义registrar_tarea路由了吗?请分享tareas.route的代码。
  • 嗨,Shubham,请查看原始帖子的更新。谢谢
  • 您是否在同一台服务器上运行前端和后端?在 url 中,您应该提供完整的 url,例如 http://someURL//api/registrar_tarea 而不是 API 的端点
  • 在下面查看我的答案,我希望它会起作用。
  • 非常感谢您对 Shubham 的跟进,我尝试了您提到的所有方法,但没有成功。在原始帖子中分享了指向 GitHub 存储库的链接,以防有人愿意仔细检查:)

标签: javascript node.js mongodb post heroku


【解决方案1】:

在我的例子中,我集成了 Cloudinary,但我忘记将环境变量添加到 heroku。谁有这个问题,请确保检查环境变量

【讨论】:

    【解决方案2】:

    由于你没有为不同的 HTTP 动词使用相同的 url,你需要像这样声明路由:

    router.post('/registrar_tarea',
            function (req, res) {
                tareas_api.registrar_tarea(req, res);
            }
        )
    

    【讨论】:

    • 试过了,没用。用 GitHub 存储库代码更新了我的原始帖子,以防有人愿意查找它。谢谢!!
    【解决方案3】:

    好的,这可能是一个新手错误,但我试图在 Heroku 中部署前端和后端,这就是为什么我在前端看不到任何东西。

    基本上在下面找到了答案:

    https://fabiofranchino.com/blog/how-to-deploy-webapp-heroku-netlify/

    【讨论】:

      【解决方案4】:

      在我的例子中,MongoDB 数据库没有任何列入白名单的 IP。

      要添加白名单 IP,请转到您的 MongoDB atlas 集群

      点击左侧面板中的“网络访问”。

      点击右侧的“添加 IP 地址”按钮

      添加您的应用程序 IP,或添加 0.0.0.0/0 以允许从任何地方访问。

      【讨论】:

        猜你喜欢
        • 2019-12-16
        • 2013-04-19
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        相关资源
        最近更新 更多