【问题标题】:Express JS/ MongoDB Post not workingExpress JS/MongoDB Post 不工作
【发布时间】:2017-10-28 05:20:26
【问题描述】:

我今天开始开发MERN 应用程序,并正在尝试编写restful api。首先我使用mlab 来存储我的mongodb 数据库。创建用户后,我已成功连接到该数据库。我可以手动创建一个collection 并将一些数据注入这个collection。然后我可以从我的server.js 文件中获取存储在此处的数据。

MongoClient.connect(db_url, (err, database) => {
    if (err) return console.log(err);
    var collection = database.collection('memories'); // Collection called memories
    app.listen(3000, () => {
        console.log("Listening on 3000");
    });
});

这一切都很好,但我想把它提升到一个新的水平。我想为集合Memory 编写一个CRUD api。来自django,我想先创建我的model。因此,在我的models/memory.js

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

var MemorySchema = new Schema({
    name: String,
    description: String
});

module.exports = mongoose.model('Memory', MemorySchema);

然后我开始着手处理我的routes/api/api.js

let router = require('express').Router();
let Memory = require('../../../models/memories');

router.use(function (req, res, next) {
    console.log("Something is happening");
    next(); // Request stops at middleware without next()
});

router.route('/memory')
    .post(function (req, res) {
        let memory = new Memory();
        memory.name = req.body.name;
        memory.description = req.body.description;

        memory.save(function (err) {
            if (err) {
                res.send(err);
            }
            res.json({message: 'Memory Created'});
        });
    })

    .get(function (req, res) {
        res.json({message: 'First memory'});
    });


module.exports = router;

在我的server.js 中,我称这个模块为:

const apiRoutes = require('./routes/api/api');
app.use('/api/', apiRoutes);

但是,在使用 postman 测试了 post api 之后,POST 请求只需要很长时间才能显示为 Could not get any response。但是,GET 请求有效。我错过了什么?

编辑:所以post 函数无法保存模型实例...

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    尝试在save函数的回调中添加results作为第一个参数,然后res.json(results, { message: "Memory Created" })看看有没有返回。

    【讨论】:

      【解决方案2】:

      post 和 get 方法的主要区别在于 post 方法使用 Mongoose,而 get 没有。如果您无法连接到数据库,则响应可能会由于memory.save(...) 无法正常工作而超时。并且在回调之外没有发送任何响应来保存,所以如果你的程序从不进入它,你将永远不会发送响应。请求最终会超时。

      在您的模型文件中,您在以下行注册模型:

      module.exports = mongoose.model('Memory', MemorySchema);
      

      Mongoose 然后会在 memorys 集合中查找数据。如果你把它改成

      module.exports = mongoose.model('Memory', MemorySchema, 'memories');
      

      它将使用 memories 集合。这将使其与您发布的 connection-to-db sn-p 一致。我不知道这是否会解决你的问题。我建议将连接代码更改为

      mongoose.connect(dburl, {
        useMongoClient: true
      });
      

      而不是原生的 mongo 客户端。你也可以添加这些行

      mongoose.connection.on('connected', function () {
          console.log('Mongoose connected');
      });
      
      mongoose.connection.on('error', function (err) {
        console.log('Mongoose connection error: ' + err);
      });
      
      mongoose.connection.on('disconnected', function () {
        console.log('Mongoose disconnected');
      });
      

      连接代码之后有助于调试。确保在启动应用程序时已连接。

      如果您在节点终端窗口中看到类似 Error: Can't set headers after they are sent. 的错误,可能是因为您在 post 函数中发送了两个响应。如果保存时发生错误,它将进入if(err) 块,发送异步响应,然后转到res.json(...) 响应并发送。

      所以你必须在发送响应后返回退出函数。要么这样

      res.send(err);
      return;
      

      或者像这样

      return res.send(err);
      

      json 响应也是如此。

      如果这不能解决问题,您应该启动调试器(node --inspectnodemon --inspect),或者在 post 函数中插入 console.log('inside post'); 以查看您是否确实在输入它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-08
        • 2019-08-29
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 2021-11-27
        • 2022-08-18
        • 2015-03-04
        相关资源
        最近更新 更多